我正在从现有的模型和数据库转换到Entity Framework。在该数据库中,有几个具有GUID列的表,这些列不是主键(或根本不是键!)。每个表都有一个ID列。GUID列上定义了ROWGUIDCOL属性以及一个DEFAULT(newid())。
现在,当我插入到数据库时,我得到了这一列的所有零。
我尝试使用数据注释:
这样做的问题在于它会丢失我的ID列上的身份属性(并给我插入错误)。此外,我注意到对于以下迁移,EF实际上为up和down方法生成了相同的SQL语句:
现在,当我插入到数据库时,我得到了这一列的所有零。
我尝试使用数据注释:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Guid {get; set;}
这样做的问题在于它会丢失我的ID列上的身份属性(并给我插入错误)。此外,我注意到对于以下迁移,EF实际上为up和down方法生成了相同的SQL语句:
public override void Up()
{
AlterColumn("dbo.Client", "Guid", c => c.Guid(nullable: false, identity: true));
}
public override void Down()
{
AlterColumn("dbo.Client", "Guid", c => c.Guid(nullable: false));
}
使用生成的SQL:
ALTER TABLE [dbo].[Client] ALTER COLUMN [Guid] [uniqueidentifier] NOT NULL
为什么上述迁移对两个语句生成相同的SQL?如何让EF生成GUID?我可以/必须在客户端(代码)空间中执行此操作吗?如果我必须这样做,如何确保跨表唯一性?
Identity
也适用于具有默认约束的非标识列。如果这不起作用,并且Computed
起作用,请坚决使用它,但请注意这是一种解决方法,并检查生成的 SQL 将(或者至少应该)向您显示 EF 将在每次保存后检索新值。 - user743382