我有一个生成数据库优先的实体框架上下文。我正在添加一个表格,其中包含将由数据库生成的GUID PK。当我从数据库生成EDMX模型时,它将StoreGeneratedPattern设置为“无”#。
。我需要手动将StoreGeneratedPattern更改为' Identity'让应用程序让数据库创建ID。
有没有办法确保EDMX能够自动正确设置此值?
答案 0 :(得分:4)
在实体框架6 中,它就是这样。如果uniqueidentifier
列是主键且具有默认值,则EDMX生成器工具不会将其标记为DatabaseGeneratedOption.Identity
。从严格意义上讲,这是正确的,因为该列没有(不能拥有)身份规范。
因此,在EDMX设计器中,您必须手动将Id列的StoreGeneratedPattern
属性设置为Identity
。好消息是这个幸存的模型更新。
EF的净效果类似于真(=数字)标识列。是否为Id列指定了显式值:
INSERT
语句SaveChanges
期间,生成的值将被读入实体。正如您的评论所示, Entity Framework-core (当前版本2.0.0)处理方式不同。从数据库(包管理器控制台:Scaffold-DbContext
)生成模型时,您将在上下文的OnModelCreating
覆盖中看到如下所示的条目:
entity.Property(e => e.Id)
.HasColumnName("ID")
.HasDefaultValueSql("(newsequentialid())");
但这种行为与EF6略有不同。如果没有为Id列设置值(即它是默认值Guid
),则行为仍然相同:
INSERT
声明SaveChanges
期间,生成的值将被读入实体。但是,当Id
列设置为默认值以外的其他值时:
INSERT
声明这意味着,除了在EF6中,作为开发人员,您必须注意,如果您希望它们始终由数据库生成,则不会为Guid
PK属性分配显式值。