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

Sht*_*nov 2 .net c# database database-design entity-framework

在我的数据库中,我有一个键/值表,我用它来存储应用程序的配置.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
Run Code Online (Sandbox Code Playgroud)

我想在我的DataBase中将这些作为例子

Key               | Value
--------------------------
DefaultpartnerID  | 1
DefaultOperatorID | 10
DefaultCurrency   | USD
DefaultCurrencyID | 2

是否可以使用EntityFramework创建此类映射?

Yul*_*dra 7

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

public class StoreConfiguration
{
    [Key]
    public string Key { get; set; }
    public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后提供扩展以添加和删除商店配置.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

用法.

using (var db = new AppContext())
{
    db.SetStoreConfiguration("DefaultpartnerID", 1);
    db.SaveChanges();
}
using (var db = new AppContext())
{
    var defaultpartnerID = db.GetStoreConfiguration<int>("DefaultpartnerID");
    db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)