我的数据库中有一个配置表,它只包含一行。
ConfirmedScheduleColor | OverlappedScheduleColor | ColN
目前,我正在检索这样的配置:
var db = new SchedulingDbContext();
var config = db.Configurations.FirstOrDefault();
它目前工作正常,我可以访问我的配置和所有。问题是,代码看起来很尴尬,因为我正在访问配置DbSet
,好像它包含许多记录(FirstOrDefault()
);实际上,它只包含一条记录。我想访问我的配置,比如我正在访问一个静态对象。如何在EF中做到这一点?
答案 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;
}
}