在Entity Framework 6中的单行表

6

我找不到解决这个问题的方法,但标题已经很明确了我的需求。

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


展示一些代码,比如你尝试过什么? - Oluwafemi
我认为原帖作者想要将其用作“锁定”位。 - RMalke
确切地说,这张表的用途将是作为“锁定”位。 - rmnblm
3个回答

1
你可以将其中一列设置为主键,并且只允许一个值。不幸的是,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的设置方法。

在数据库层面上,您仍然可以打破这个范例。这里的答案说明了如何创建检查约束。

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...");
            }
        }

0
通过一些研究,我想出了这个解决方案。我为数据库创建了一个初始化程序(因为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");
    }
}

希望这对其他人有所帮助 :)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接