ahm*_*met 575 c# entity entity-framework
我在Asp.net中遇到了Entity Framework的问题.每当我将对象添加到数据库时,我想获取Id值.我怎样才能做到这一点?
Lad*_*nka 938
这很容易.如果您正在使用DB生成的ID(如IDENTITY
在MS SQL),你只需要实体增加ObjectSet
和SaveChanges
对相关ObjectContext
.Id
将自动为您填写:
using (var context = new MyContext())
{
context.MyEntities.Add(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Yes it's here
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,实体框架遵循各INSERT
用SELECT SCOPE_IDENTITY()
时自动生成的Id
用于秒.
mar*_*k_h 105
我一直在使用Ladislav Mrnka的答案,在使用实体框架时成功检索ID,但是我在这里发帖是因为我错过了使用它(即在不需要的地方使用它)并认为我会在此发布我的发现 -案例人们正在寻求"解决"我遇到的问题.
考虑与Customer具有外键关系的Order对象.当我在同一时间添加新客户和新订单时,我正在做这样的事情;
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
Run Code Online (Sandbox Code Playgroud)
但是在我的情况下,这不是必需的,因为我在customer.Id和order.CustomerId之间有一个外键关系
我所要做的就是这个;
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
Run Code Online (Sandbox Code Playgroud)
现在,当我保存更改时,为客户生成的ID也会添加到订单中.我不需要额外的步骤
我知道这并没有回答原来的问题,但认为这可能会帮助EF新手的开发人员过度使用最高投票的答案,而这些答案可能并不需要.
QMa*_*ter 32
您需要在savechanges之后重新加载实体.因为它已被EF无法跟踪的数据库触发器更改.所以我们需要再次从数据库重新加载实体,
db.Entry(MyNewObject).GetDatabaseValues();
Run Code Online (Sandbox Code Playgroud)
然后
int id = myNewObject.Id;
Run Code Online (Sandbox Code Playgroud)
请看以下问题中的@jayantha答案:
使用defaultValue时,如何在Entity框架中获取插入实体的Id?
在下面的问题中看@christian答案也可能有所帮助:
Azh*_*uri 16
请参阅此链接.
http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/
您必须将StoreGeneratedPattern的属性设置为identity,然后尝试自己的代码.
否则你也可以使用它.
using (var context = new MyContext())
{
context.MyEntities.AddObject(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Your Identity column ID
}
Run Code Online (Sandbox Code Playgroud)
小智 5
我遇到了一种情况,我需要在数据库中插入数据并同时使用实体框架需要主 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;
}
Run Code Online (Sandbox Code Playgroud)