如何在 EF 中像静态对象一样访问配置

问题描述 投票:0回答:3

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

ConfirmedScheduleColor | OverlappedScheduleColor | ColN

目前,我正在检索如下配置:

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

目前工作正常,我可以访问我的配置等。问题是,代码看起来很尴尬,因为我正在访问配置

DbSet
,就好像它包含许多记录一样(
FirstOrDefault()
);尽管实际上它只包含一条记录。我想像访问静态对象一样访问我的配置。如何在 EF 中做到这一点?

entity-framework
3个回答
21
投票

您可以简单地向您的

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

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

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

1
投票

我的项目中有一个类,它具有用于检索配置设置的静态方法。我使用

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

-1
投票

在 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
});
© www.soinside.com 2019 - 2024. All rights reserved.