什么是正确的使用HasColumnType和数据库生成

本文关键字:HasColumnType 数据库 什么 | 更新日期: 2023-09-27 18:08:34

我正在将大约80个实体的EF模型从EF4迁移到EF6,并且我还将其从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);

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

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

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

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

在数据库中,它有一个默认的newsequentialid(),我应该配置它与DatabaseGeneratedOption.None, DatabaseGeneratedOption.Identity,或DatabaseGeneratedOption.Computed ?

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

Guid ID = new Guid.NewGuid()

这样合适吗?

什么是正确的使用HasColumnType和数据库生成

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

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

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

我不是这些东西如何在内部实现的专家,但我不能告诉你我从使用它们中了解到什么。

关于使用HasColumnType方法的第一个问题:

HasColumnType("varchar(50)")

实体框架不识别类型"varchar(50)",但它识别类型"varchar"。ef(在版本6中检查过)的唯一正确用法是:

.HasColumnType("varchar")
.HasMaxLength(50)

关于第二个问题- DatabaseGeneratedOption。从我对EF的经验来看,DatabaseGeneratedOption之间没有区别。Computed和DatabaseGeneratedOption。没有——它对待它们是一样的。只有DatabaseGeneratedOption有区别。Identity -在这种情况下,column被定义为Identity column,并且在从应用程序向db插入数据时传递给它的值将被忽略,而是由数据库分配。如果将列定义为DatabaseGeneratedOption。None或DatabaseGeneratedOption。然后需要为ID列提供如下所示的值:

Guid ID = new Guid.NewGuid()

否则,它将尝试始终为GUID分配默认值(所有数字设置为零)。如果将列指定为DatabaseGeneratedOption。那么,在将ID保存到db之前,您不需要关心为ID分配值。相反,它将由dbms设置为默认值(在您的情况下是"newsequentialid()")。所以正确的选择是databasegeneratedoption。identity。