什么是正确的使用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()
这样合适吗?
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。