ApplicationConfiguration

ApplicationConfiguration

之前我有一个名为ApplicationConfiguration的表,该表仅具有[Key],[Value]列来存储一些配置数据。可以使用SQL查询立即查询。现在,我打算使用实体框架(EF)代码优先方法来查询此表。该表的特长是该表在其生命周期中仅具有固定数量的行。只有“值”列可以更新。因此,按照代码优先方法,我们必须首先编写带有其属性的POCO类,该属性将映射到基础表中的列。但是,我希望有一个Dictionary 结构来表示这些配置KV对。我担心的是,EF是否能够针对特定对值的任何更新触发更新查询。另外,由于我使用的是Code First方法,因此我希望在首次执行应用程序时动态创建表本身之后添加一些种子数据(即固定行数及其初始内容)。如果无法使用Dictionary ,请提出一些替代方案。提前致谢。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 这样编码:public class ApplicationConfiguration{ public int Id { get; set; } public string Key { get; set; } public int Value { get; set; } // should be string, but I'm lazy}class Context : DbContext{ internal class ContextInitializer : DropCreateDatabaseIfModelChanges<Context> { protected override void Seed(Context context) { var defaults = new List<ApplicationConfiguration> { new ApplicationConfiguration {Key = "Top", Value = 5}, new ApplicationConfiguration {Key = "Bottom", Value = 7}, new ApplicationConfiguration {Key = "Left", Value = 1}, new ApplicationConfiguration {Key = "Right", Value = 3} };// foreach (var c in defaults)// context.ConfigurationMap.Add(c.Key, c); // by design, no IReadOnlyDictionary.Add foreach (var c in defaults) context.ApplicationConfigurations.Add(c); base.Seed(context); } } public Context() { Database.SetInitializer(new ContextInitializer()); } private IDbSet<ApplicationConfiguration> ApplicationConfigurations { get { return Set<ApplicationConfiguration>(); } } public IReadOnlyDictionary<string, ApplicationConfiguration> ConfigurationMap { get { return ApplicationConfigurations.ToDictionary(kvp => kvp.Key, kvp => kvp); } }}使用这种方式:using (var context = new Context()){ ReadConfigurationOnly(context.ConfigurationMap);}using (var context = new Context()){ ModifyConfiguration(context.ConfigurationMap); context.SaveChanges();}static void ReadConfigurationOnly(IReadOnlyDictionary<string, ApplicationConfiguration> configuration){ foreach (var k in configuration.Keys) Console.WriteLine("{0} = {1}", k, configuration[k].Value);}static void ModifyConfiguration(IReadOnlyDictionary<string, ApplicationConfiguration> configuration){ foreach (var k in configuration.Keys) configuration[k].Value++; // this is why I was lazy, using an int for a string}因此,我以这种方式(使用int Value属性而不是string)进行了编写,只是这样,我可以一遍又一遍地运行“以这种方式使用”代码,并每次查看数据库更新,而无需必须以一种有趣的方式提出其他方法来更改Value。使用IReadOnlyDictionary<string, ApplicatonConfiguration>而不是IReadOnlyDictionary<string, string>并不是我们想要的那样漂亮,但这远远超出了以下事实:我们可以轻松地修改集合值而无需笨拙以字典为输入的Set方法。缺点当然是我们必须满足于configuration[key].Value = "new value"而不是configuration[key] = "new value",但是-正如我所说-我认为这是值得的。编辑ang!我是专门为回答这个问题而编写的代码,但是我想我非常喜欢它,我将其添加到我的技巧包中……当我的公司从本地数据库转到Azure时,这非常合适实例在云中,并且当前的app.config必须进入数据库。现在我需要的是一个ContextInitializer以System.Configuration.ConfigurationManager作为ctor参数,以便从现有app.config播种新数据库。 (adsbygoogle = window.adsbygoogle || []).push({});
10-04 12:05