实体框架中的单行表

本文关键字:单行表 框架 实体 | 更新日期: 2023-09-27 18:01:36

我找不到这个问题的解决方案,但标题清楚地表明我想要什么。

是否可以创建单行表(我只需要在表中存储布尔值)?我如何使用Fluent API配置此约束?

实体框架中的单行表

您可以将其中一列设为主列,并且只允许一个值。不幸的是,fluent API目前不支持默认值

public class StatusIdentifer
{
  [DefaultValue("1")]
  [Key]
  public int id {get; set}; //set can be removed here?
  public bool status {get:set;} //your boolean value
}

技巧是不暴露id的任何set方法。

在数据库级别,您仍然可以打破范式。这里的答案告诉我们如何创建一个检查约束

public void InitializeDatabase(MyRepository context) {
            if (!context.Database.Exists() || !context.Database.ModelMatchesDatabase()) {
                context.Database.DeleteIfExists();
                context.Database.Create();
                context.ObjectContext.ExecuteStoreCommand("CREATE UNIQUE CONSTRAINT...");
                context.ObjectContext.ExecuteStoreCommand("CREATE INDEX...");
                context.ObjectContext.ExecuteStoreCommand("ETC...");
            }
        }

经过一番研究,我想出了这个解决方案。我为数据库创建了一个初始化器(因为ExecuteSqlCommand不能在OnModelCreating方法中调用)。

class UserDbInitializer : CreateDatabaseIfNotExists<UserDbContext>
{
    protected override void Seed(UserDbContext context)
    {
        context.Database.ExecuteSqlCommand(
            "CREATE TABLE __Lock(" +
            "Id char(1) NOT NULL DEFAULT 'X'," +
            "Lock bit NOT NULL," +
            "CONSTRAINT PK_LOCK PRIMARY KEY (Id)," +
            "CONSTRAINT CK_LOCK_Locked CHECK (Id='X'))"
        );
        context.Database.ExecuteSqlCommand(
            "INSERT INTO __Lock VALUES('X', 0)"
        );
        base.Seed(context);
    }
}

在UserDbContext中是如下属性:

public bool Locked
{
    get
    {
        return Database.SqlQuery<bool>("SELECT Lock FROM __Lock").SingleAsync().Result;
    }
    set
    {
        if (value)
            Database.ExecuteSqlCommand("UPDATE __Lock SET Lock = 1");
        else
            Database.ExecuteSqlCommand("UPDATE __Lock SET Lock = 0");
    }
}

希望对大家有所帮助

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