EntityFramework Database First - 自动设置StoreGeneratedPattern值

时间:2017-09-29 14:08:01

标签: .net sql-server entity-framework

我有一个生成数据库优先的实体框架上下文。我正在添加一个表格,其中包含将由数据库生成的GUID PK。当我从数据库生成EDMX模型时,它将StoreGeneratedPattern设置为“无”#。

我需要手动将StoreGeneratedPattern更改为' Identity'让应用程序让数据库创建ID。

有没有办法确保EDMX能够自动正确设置此值?

1 个答案:

答案 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属性分配显式值。