我的数据库中有一个配置表,它只包含一行。
ConfirmedScheduleColor | OverlappedScheduleColor | ColN
目前,我正在检索如下配置:
var db = new SchedulingDbContext();
var config = db.Configurations.FirstOrDefault();
目前工作正常,我可以访问我的配置等。问题是,代码看起来很尴尬,因为我正在访问配置
DbSet
,就好像它包含许多记录一样(FirstOrDefault()
);尽管实际上它只包含一条记录。我想像访问静态对象一样访问我的配置。如何在 EF 中做到这一点?
您可以简单地向您的
DbContext
添加一个返回 Configurations.FirstOrDefault()
的属性,并将 DbSet
私有化:
public class SchedulingDbContext : DbContext
{
private DbSet<Configuration> Configurations { get; set; }
public Configuration Configuration
{
get
{
return Configurations.FirstOrDefault();
}
}
}
我的项目中有一个类,它具有用于检索配置设置的静态方法。我使用
ConfigurationManager
而不是数据库,但您可以调整它以从存储值的任何位置获取设置。
在我的示例中,我为您编写了一个 GetFromDb 方法,该方法将键作为参数,但这是因为如果我将配置设置存储在数据库中,我不想每次需要新的配置设置时都添加一列。我会有一个包含键/值列的表。如果您热衷于单行表,那么您可能不想使用这种方法。
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;
}
}
在 EF Core 中可以设置主键的检查约束。它强制列 Id 的值必须等于 1,这意味着如果您有主键,表中只能存在一条记录。
modelBuilder.Entity<YourTable>(e =>
{
e.HasCheckConstraint("CK_Table_Column", "[Id] = 1");
e.HasData(...) //optionally add some initial date for Id = 1
});