实体框架 6 Guid 生成 null?

Posted

技术标签:

【中文标题】实体框架 6 Guid 生成 null?【英文标题】:Entity Framework 6 Guid generated null? 【发布时间】:2015-02-25 03:29:28 【问题描述】:

我正在使用 Asp.net mvc 5 和 EF 6 来制作 Web 应用程序。我从 Internet 应用模板开始并添加了这些类:

public class Article

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ID  get; set; 
    public string Tags  get; set;  
    public string Name  get; set; 
    public string Link  get; set; 
    public string htmlContent  get; set; 
    [ForeignKey("ListaId")]
    public Lista Lista  get; set; 
    public Guid ListaId  get; set; 


public class List


    public string Name  get; set; 
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ID  get; set; 
    public int Status  get; set;  
    public virtual ApplicationUser User  get; set; 
    public string ApplicationUserId  get; set; 
    public string Tags  get; set;  

但每次 nuget 包管理器更新数据库并运行 Seed 方法时,尝试在数据库中插入文章时都会中断。 这是configuration.cs中的种子方法

        context.Lists.AddOrUpdate(new Lista
        
            Name = "Technology",
            ApplicationUserId = "f06b0d2e-2088-4cd7-8b1c-4fcad5619f3c",
            Status = 1,
            Tags = "Tech,News"
        );
        context.SaveChanges();

        Lista l1 = context.Lists.Where(x => x.Status == 1).First();

        context.Articles.AddOrUpdate(new Article
        
            ListaId = l1.ID,
            Link = "www.abc.com",
            Name = "ABC",
            Tags = "c,test",
            HtmlContent = "Hello World"
        );
        context.SaveChanges(); //here it breaks

内部异常:System.Data.SqlClient.SqlException: 无法插入 值 NULL 到列“ID”,表 'aspnet-Webapp-20141022011020.dbo.Articles';列不允许 空值。 INSERT 失败如果我使用 [Key],我会得到同样的错误 注释掉文章类,如果我拿 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 我得到的注解 以下错误:System.Data.SqlClient.SqlException:违反 主键约束“PK_dbo.Articles”。无法插入重复键 在对象“dbo.Articles”中。重复键值为 (00000000-0000-0000-0000-000000000000)。

在 Guid 的位置使用 long/int 我收到更新数据库错误,例如:uniqueidentifier 与 bigint/int 不兼容。

我能做什么?为什么不使用 guid 生成正确的 id?

【问题讨论】:

【参考方案1】:

你必须告诉数据库你想要这样的行为。通常,如果您使用代码优先的方法,EF6 就足够智能,它将能够生成正确的行为。

进入数据库,修改ID字段,并将其添加到默认值:newsequentialid()

如果您想自己创建 Guid:

public class Article

    [Key]
    public Guid ID  get; set; 
    public string Tags  get; set;  
    public string Name  get; set; 
    public string Link  get; set; 
    public string HtmlContent  get; set; 
    [ForeignKey("ListaId")]
    public Lista Lista  get; set; 
    public Guid ListaId  get; set; 

    public Article()
       ID = Guid.NewGuid();
    


【讨论】:

对不起...我在哪里添加 newsequentialid()? @CristianDan;您可以尝试在您的数据库上运行此 SQL 查询:ALTER TABLE dbo.TableName ADD CONSTRAINT DF_ColumnName DEFAULT newsequentialid() FOR ColumnName,将名称替换为您的表/ID 列。 非常感谢......它正在工作......我找到了在哪里写 newsequentialid() :D 谢谢 @CristianDan:您可能需要修改代码优先迁移文件,这些属性还不够:***.com/questions/18200817/… 请参阅 Joy 的回答。 +1。感谢您的回答,但我认为 Guid = Guid.NewGuid(); 应该是 ID = Guid.NewGuid(); 除非我在这里遗漏了什么?

以上是关于实体框架 6 Guid 生成 null?的主要内容,如果未能解决你的问题,请参考以下文章

实体框架代码优先多对多不使用 GUID 加载相关实体

实体框架代码优先与 Guid

为啥实体框架 6 中仍未实现 ON DELETE SET NULL?有障碍吗?

实体框架指南

实体框架6代码首先用oracle更新实体

实体框架 6 并且为空