6

I couldn't find a solution for this problem but the title makes clear what I want.

Is it possible to create a single row table (I only need to store a boolean value in a table)? And how can I configure this constraint with Fluent API?

rmnblm
  • 147
  • 2
  • 9

3 Answers3

1

you could make one of the columns as primary and also allow only one value. unfortunately fluent api currently doenst support default value

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

the trick is not to expose any set methods for id.

at database level you can still break the paradigm. The answer here tells how to create a check constraint

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...");
            }
        }
Community
  • 1
  • 1
Krishna
  • 2,451
  • 1
  • 26
  • 31
0

With a bit of research I came up with this solution. I created an Initializer for the database (because ExecuteSqlCommand cannot be invoked in the OnModelCreating method).

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

And in the UserDbContext is following property:

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

Hope this helps for others :)

rmnblm
  • 147
  • 2
  • 9
0

In EF Core you can set the check constraint for the primary key. It enforces that column Id must have value that is equal to 1.

modelBuilder.Entity<YourTable>(e =>
{
   e.HasCheckConstraint("CK_Table_Column", "[Id] = 1");

   e.HasData(...) //optionally add some initial date for Id = 1
});
axelio
  • 159
  • 4