2014-12-28 158 views
1

我使用Asp.net mvc 5和EF 6制作一个网络应用程序。我开始与互联网的应用程序模板,并添加这些类:实体框架6 Guid生成null?

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包管理器更新数据库,并运行种子的方法时,它试图插入在数据库中的文章下破坏。 这里是在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。文章;列不允许有空值。 INSERT失败 如果我将[Key] adnotation从Article类中取出,并且如果采用[DatabaseGenerated(DatabaseGeneratedOption.Identity)] adnotation,则会出现以下错误:System.Data.SqlClient.SqlException:违规PRIMARY KEY约束'PK_dbo.Articles'。无法在对象'dbo.Articles'中插入重复键。重复键值是(00000000-0000-0000-0000-000000000000)。 在Guid的地方使用long/int,我得到一个更新数据库错误,如:uniqueidentifier与bigint/int不兼容。

我该怎么办?为什么它不是用GUID生成一个合适的ID?

回答

3

你必须告诉数据库你想要这样的行为。通常情况下,如果您使用代码优先的方法,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(); 
    } 

} 
+0

对不起...我添加NEWSEQUENTIALID()在哪里? –

+0

@CristianDan;你可以尝试在数据库上运行这个SQL查询:'ALTER TABLE dbo.TableName ADD CONSTRAINT DF_ColumnName DEFAULT newsequentialid()FOR ColumnName',用您的表/ ID列替换名称。 –

+1

非常感谢..它的工作...我发现在哪里写newsequentialid():D谢谢 –