2011-03-06 92 views
407

我在Asp.net中遇到了实体框架问题。无论何时将对象添加到数据库,我都想获取Id值。我怎样才能做到这一点?如何获取实体框架中插入实体的ID?

+11

由拉吉斯拉夫Mrnka答案是正确的答案,并应接受这样的。 – 2016-05-17 07:40:43

+1

OP只会用他/她的账户发布一次,这个问题要更具体一些。这给了他/她几乎2K的声望(!),答案没有被标记为接受,因为该账户自那一天起被放弃。 – MurariAlex 2017-09-15 19:48:18

回答

8

在将更改传播到数据库后,要保存的对象应具有正确的Id

+0

我们这样的错误“而更新entires错误occurued。详情请参阅内部异常” – ahmet 2011-03-06 19:37:37

+25

你见过的内部异常? ;-) – Snowbear 2011-03-06 20:02:00

691

这很简单。如果您使用数据库生成的ID(例如MS SQL中的IDENTITY),则只需将实体添加到相关的ObjectContext上的ObjectSetSaveChanges即可。 Id会自动填写你:

using (var context = new MyContext()) 
{ 
    context.MyEntities.AddObject(myNewObject); 
    context.SaveChanges(); 

    int id = myNewObject.Id; // Yes it's here 
} 

默认实体框架遵循每个INSERTSELECT SCOPE_IDENTITY()当使用自动生成的Id秒。

+30

所以你问错了问题。如果您遇到异常问题,您应该提问显示您的异常(以及内部异常)和导致该错误的代码段。 – 2011-03-06 20:09:01

+1

请确保您添加的实体是一个有效的实体例如,用“不空”数据库的限制,仍必须填写等 – fran 2011-06-03 09:35:44

+1

@LadislavMrnka:关于新创建的对象的导航属性是什么?保存更改后,它们似乎不会自动填充。 – 2014-11-11 18:21:15

18

您需要在savechanges后重新加载实体。因为它已被EF无法跟踪的数据库触发器更改。因此,我们需要从数据库重新载入实体,

db.Entry(MyNewObject).GetDatabaseValues(); 

然后

int id = myNewObject.Id; 

请看下面的问题@jayantha答案:

How can I get Id of inserted entity in Entity framework when using defaultValue?

+1

嗨,当我这样做,我得到的编译错误,说:无法解析属性,例如ID或名称,你能帮助我吗? – 2014-10-17 05:41:27

+0

@MortezaAzizi这似乎是没有处理或空属性问题的错误,但你可以请更多的解释或写一些代码片段? – QMaster 2014-10-18 08:54:29

1

我遇到的情况我需要在数据库中插入数据&同时需要使用实体框架的主ID。 解决方案:

long id; 
IGenericQueryRepository<myentityclass, Entityname> InfoBase = null; 
try 
{ 
    InfoBase = new GenericQueryRepository<myentityclass, Entityname>(); 
    InfoBase.Add(generalinfo); 
    InfoBase.Context.SaveChanges(); 
    id = entityclassobj.ID; 
    return id; 
} 
4
Repository.addorupdate(entity, entity.id); 
Repository.savechanges(); 
Var id = entity.id; 

这将工作。

+1

版本库不负责将更改保存到数据库中。这是UnitOfWork的工作。 – tchelidze 2017-11-11 10:55:32

37

我一直在使用Ladislav Mrnka's answer在使用实体框架时成功检索ID,但是由于我一直错过使用它(即在不需要它的地方使用它),并且认为我会在此发布我的发现在这种情况下,人们正在寻求“解决”我所遇到的问题。

考虑与客户具有外键关系的订单对象。当我在同一时间添加新客户和新订单时,我正在做这样的事情;

var customer = new Customer(); //no Id yet; 
var order = new Order(); //requires Customer.Id to link it to customer; 
context.Customers.Add(customer); 
context.SaveChanges();//this generates the Id for customer 
order.CustomerId = customer.Id;//finally I can set the Id 

但在我的情况下,这不是必需的,因为我有customer.Id和订单之间的外键关系。客户编号

我所要做的就是这一点;

var customer = new Customer(); //no Id yet; 
var order = new Order{Customer = customer}; 
context.SaveChanges();//adds customer.Id to customer and the correct CustomerId to order 

现在,当我保存更改时,为客户生成的ID也会添加到订单中。我已经不再需要额外的步骤

我知道这并不能回答原来的问题,但认为它可能帮助开发谁是新的EF过度使用得票最多的答案的东西,可能不需要。

+2

谢谢!重要最佳实践提示:var order = new Order {Customer = customer};这显示了Entity Framework分配相关对象的强大功能,并且Id将自动更新。 – 2017-07-09 19:06:17

+0

感谢您特别指出这一点。我正在做默认的。为此+1 – user2695433 2017-09-19 05:33:51

3

只能保存后得到的ID,而不是你可以创建一个新的GUID和保存之前分配。

0

当您使用EF 6.x的代码首先

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 

并初始化数据库表,就会把一个

(newsequentialid()) 

表格属性里面的头默认值,或绑定下,允许该ID在插入时填充。

的问题是,如果你创建一个表,并在以后添加

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 

一部分,未来的更新数据库将不会加回(NEWSEQUENTIALID())

要解决的正确方法是擦除迁移,删除数据库并重新迁移......或者您可以将(newsequentialid())添加到表设计器中。下面