实体框架,我可以将类映射到键/值表吗?

时间:2014-08-21 07:21:15

标签: c# .net database entity-framework database-design

在我的数据库中,我有一个键/值表,用于存储应用程序的配置。 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创建此类映射?

2 个答案:

答案 0 :(得分:5)

您可能希望使用包含KeyValue属性的简单实体。

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));
}