实体框架 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?的主要内容,如果未能解决你的问题,请参考以下文章