代表EF中的单行表?

时间:2013-11-18 09:23:57

标签: entity-framework

我的数据库中有一个配置表,它只包含一行。

ConfirmedScheduleColor | OverlappedScheduleColor | ColN

目前,我正在检索这样的配置:

var db = new SchedulingDbContext();
var config = db.Configurations.FirstOrDefault();

它目前工作正常,我可以访问我的配置和所有。问题是,代码看起来很尴尬,因为我正在访问配置DbSet,好像它包含许多记录(FirstOrDefault());实际上,它只包含一条记录。我想访问我的配置,比如我正在访问一个静态对象。如何在EF中做到这一点?

2 个答案:

答案 0 :(得分:10)

您只需向DbContext添加一个返回Configurations.FirstOrDefault()并将DbSet私有化的属性:

public class SchedulingDbContext : DbContext
{
    private DbSet<Configuration> Configurations { get; set; }

    public Configuration Configuration
    {
        get
        {
            return Configurations.FirstOrDefault();
        }
    }
}

答案 1 :(得分:1)

我的项目中有一个类,它有静态方法来检索配置设置。我使用ConfigurationManager而不是数据库,但您可以调整它以从存储值的任何位置获取设置。

在我的示例中,我为您编写了一个GetFromDb方法,它将一个键作为参数,但这是因为如果我将配置设置存储在数据库中,我不希望每次需要新配置时都添加一列设置。我会有一个包含Key / Value列的表。如果您坚持使用单行表,那么您可能希望没有这样的方法。

public class Config
{
    private _ConfirmedScheduleColor;

    public static string ConfirmedScheduleColor 
    {
        get 
        { 
           if(_ConfirmedScheduleColor == null)
              _ConfirmedScheduleColor = GetFromDb("ConfirmedScheduleColor"); 
           return _ConfirmedScheduleColor;
        }
    }

    public static string OverlappedScheduleColor
    {
        get { return GetValue("OverlappedScheduleColor", "Pink"); }
    }

    public static int ColN
    {
        get { return GetValue("ColN", 2); }
    }

    private static string GetFromDb(string key)
    {
        if(key == "ConfirmedScheduleColor")
        {
           var config = db.Configurations.FirstOrDefault();
           return config.ConfirmedScheduleColor;
        }
    }

    private static string GetValue(string key, string defaultValue)
    {
        return ConfigurationManager.AppSettings[key] ?? defaultValue;
    }

    private static string GetValue(string key, int defaultValue)
    {
        int i;
        if(int.TryParse(ConfigurationManager.AppSettings[key], out i))
           return i;

        return defaultValue;
    }
}