簡體   English   中英

Entity Framework 6 中的單行表

[英]Single Row Table in Entity Framework 6

我找不到解決此問題的方法,但標題清楚地說明了我想要什么。

是否可以創建單行表(我只需要在表中存儲一個 boolean 值)? 以及如何使用 Fluent API 配置此約束?

您可以將其中一列作為主列,也只允許一個值。 不幸的是,流暢的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
}

訣竅是不要暴露任何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...");
            }
        }

通過一些研究,我想出了這個解決方案。 我為數據庫創建了一個初始化程序(因為無法在OnModelCreating方法中調用ExecuteSqlCommand)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM