在我的数据库中,我有一个键/值表,用于存储应用程序的配置。 StoreConfiguration类的一些示例设置,我想映射到此键/值表。
public class StoreConfiguration
{
//.... more settings
public int DefaultPartnerID { get; set; }
public int DefaultOperatorID { get; set; }
public string DefaultCurrency { get; set; }
public int DefaultCurrencyID { get; set; }
//.... more settings
我想在我的DataBase中将其作为例如
Key | Value -------------------------- DefaultpartnerID | 1 DefaultOperatorID | 10 DefaultCurrency | USD DefaultCurrencyID | 2
是否可以使用EntityFramework创建此类映射?
答案 0 :(得分:5)
您可能希望使用包含Key
和Value
属性的简单实体。
public class StoreConfiguration
{
[Key]
public string Key { get; set; }
public string Value { get; set; }
}
然后提供添加和删除商店配置的扩展程序。
public static class StoreConfigurationExtension
{
public static T GetStoreConfiguration<T>(this DbContext db, string key)
{
var sc = db.Set<StoreConfiguration>().Find(key);
if (sc == null) return default(T);
var value = sc.Value;
var tc = TypeDescriptor.GetConverter(typeof(T));
try
{
var convertedValue = (T)tc.ConvertFromString(value);
return convertedValue;
}
catch (NotSupportedException)
{
return default(T);
}
}
public static void SetStoreConfiguration(this DbContext db, string key, object value)
{
var sc = db.Set<StoreConfiguration>().Find(key);
if (sc == null)
{
sc = new StoreConfiguration { Key = key };
db.Set<StoreConfiguration>().Add(sc);
}
sc.Value = value == null ? null : value.ToString();
}
}
使用。
using (var db = new AppContext())
{
db.SetStoreConfiguration("DefaultpartnerID", 1);
db.SaveChanges();
}
using (var db = new AppContext())
{
var defaultpartnerID = db.GetStoreConfiguration<int>("DefaultpartnerID");
db.SaveChanges();
}
答案 1 :(得分:1)
不,实体框架不适用于此。但您仍然可以使用反射将数据加载到此类中。
var entities = ...;
var o = new StoreConfiguration();
foreach(var p in typeof(StoreConfiguration).GetProperties())
{
var entity = entities.FirstOrDefault(e=>e.Key == p.Name);
if (entity == null) continue;
var converter = TypeDescriptor.GetConvertor(p.Type);
p.SetValue(o, converter.ConvertFromString(entity.Value));
}