HasColumnType和Database生成的正确用法是什么

kpk*_*k47 6 c# entity-framework fluent-interface

我正在将大约EF模型从EF4迁移到EF6的大约EF模型,我也将它从Designer EDMX生成的数据库更改为Code First数据库.

现在我正在使用EF fluent-api配置实体关系,我不确定我是否正确使用它.

它是SQL Server数据库中的类型varchar(50),所以我应该像这样配置它吗?

        mb.Entity<SomeObject>()
            .Property(so => so.Type)
            .IsUnicode(false)
            .HasColumnName("Type")
            .HasColumnType("varchar")
            .HasMaxLength(50)
            .IsRequired()
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
Run Code Online (Sandbox Code Playgroud)

或者像这样,没有HasMaxLength(50)

        mb.Entity<SomeObject>()
            .Property(crt => crt.Type)
            .IsUnicode(false)
            .HasColumnName("Type")
            .HasColumnType("varchar(50)")
            .IsRequired()
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
Run Code Online (Sandbox Code Playgroud)

另外,假设我有另一个带有GUID ID的对象:

    mb.Entity<AnotherObject>()
        .Property(ao => ao.ID)
        .HasColumnName("ID")
        .HasColumnType("uniqueidentifier")
        .IsRequired()
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
Run Code Online (Sandbox Code Playgroud)

在数据库中它有一个默认的newsequentialid(),我应该是配置方面DatabaseGeneratedOption.None,DatabaseGeneratedOption.IdentityDatabaseGeneratedOption.Computed

这些选项有什么区别?此外,在代码中,GUID主要在对象实例化时分配,如下所示:

Guid ID = new Guid.NewGuid()
Run Code Online (Sandbox Code Playgroud)

这合适吗?

小智 12

varchar(50)本身不是列类型,'varchar'是数据类型,而(50)是字符串中字符的最大长度.你必须这样做

mb.Entity<SomeObject>()
            .Property(so => so.Type)
            .IsUnicode(false)
            .HasColumnName("Type")
            .HasColumnType("varchar")
            .HasMaxLength(50)
            .IsRequired()
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
Run Code Online (Sandbox Code Playgroud)

对于第二个问题,如果你不给GUID,它将在数据库的设置中设置为GUID的默认值,如果你想设置它,使用GUID生成器类.