2015-09-27 20 views
-1

我下面的实体框架指南:为什么不试图插入一个唯一的种子列时的实体框架给出一个错误?

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”到博客数据库,但有BlogID不是3,并通过SQL服务器设置。

+0

我不,如果你将它们明确 – Domysee

+1

因为在实体的属性设置为true的属性知道你正在使用的数据库,但通常可以覆盖自动生成的值。我完全不记得名字,但像StoreGeneratedPattern一样。它只是忽略了你提供的价值。改变它,你会得到一个错误。 –

+0

如果你不希望它是自动生成的,你可以使用属性'[DatabaseGenerated(DatabaseGeneratedOption.None)]'施加于'BlogId'财产。 – Hopeless

回答

0

我不能为实体框架团队说话,但我能想到的原因有三:

  1. 实体框架有你的数据模型,因此它知道产生BlogId汽车,因此将不包括该列中的INSERT SQL命令将其发送到数据库服务器;

  2. 程序员几乎从不会要设置BlogId时还要加一个Blog,所以therer没有点实体框架浪费时间在检查是否已经设置BlogId的值或没有;

  3. BlogId将被分配一个默认值(即零),当你做new Blog { ... }没有明确给出BlogId的值,所以实体框架不能肯定是否已经设置BlogId的值由你,反正。

0

EntityFramework忽略自动生成的列(如ID)的值。如果你觉得的情况时,你犯了一个新的Blog对象而不指定Id财产C#将它分配一个0值,因为这是数字类型的默认值。所以每次你想用EF插入数据库中的东西时,你都会得到一个具有ID值的对象,这应该是一个问题。这就是为什么EF忽略数据库模型的ID属性的值。

相关问题