我正在使用Asp.net mvc 5和EF 6制作网络应用。我开始使用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包管理器更新db并运行Seed方法时,它都会在尝试在db中插入一篇文章时中断。 这是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失败 如果我从Article类中取出[Key]注释,如果我使用[DatabaseGenerated(DatabaseGeneratedOption.Identity)]注释,我会得到以下错误:System.Data.SqlClient.SqlException:违反PRIMARY KEY约束'PK_dbo.Articles'。无法在对象'dbo.Articles'中插入重复键。重复键值为(00000000-0000-0000-0000-000000000000)。 在Guid的地方使用long / int我得到一个更新数据库错误,如:uniqueidentifier与bigint / int不兼容。
我该怎么办?为什么不用guid生成一个正确的id?
答案 0 :(得分: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();
}
}