我正在关注实体框架指南:
https://msdn.microsoft.com/en-au/data/jj200620
在我需要添加博客的部分,我执行以下操作:
var blog = new Blog { Name = "TEST123",
BlogId=3 };
db.Blogs.Add(blog);
db.SaveChanges();
这可以在不给我任何错误的情况下工作,但BlogId将自动生成,因为该表将列作为唯一的种子值。
为什么在运行代码时这不会给我带来任何错误?它只是在名称列中插入“TEST123”并自动生成ID?我认为它应该给我错误警告我插入的值不会有3的BlogId
更新:它没有给出任何错误,但它确实将“TEST123”插入到博客数据库中,但是博客ID不是3,并且是由SQL Server设置的。
答案 0 :(得分:0)
我不能代表实体框架团队,但我可以想到三个原因:
实体框架具有您的数据模型,因此它知道BlogId
是自动生成的,因此不会在它发送到数据库服务器的INSERT
SQL命令中包含该列;
程序员在添加BlogId
时几乎不想设置Blog
,因此实体框架没有必要浪费时间检查您是否设置了BlogId
是否为值;
BlogId
而没有明确给出new Blog { ... }
值时, BlogId
将被分配一个默认值(即零),因此实体框架无法确定您是否'无论如何,都要将BlogId
设置为值。
答案 1 :(得分:0)
EntityFramework忽略自动生成的列(如ID)的值。如果您在未指定Blog
属性的情况下创建新Id
对象时考虑到这种情况,C#将为其分配0
值,因为这是数值类型的默认值。因此,每当您想要在数据库中使用EF插入内容时,您将拥有一个具有ID值的对象,这应该是一个问题。这就是EF忽略数据库模型ID属性值的原因。