C# 获取实体框架表中的最后一个ID,以便将新记录设置为LastID+1?
我将实体框架与Oracle数据库一起用于MVC5应用程序。对于创建新供应商实体的控制器操作,我有以下内容:C# 获取实体框架表中的最后一个ID,以便将新记录设置为LastID+1?,c#,asp.net-mvc,oracle,linq,entity-framework,C#,Asp.net Mvc,Oracle,Linq,Entity Framework,我将实体框架与Oracle数据库一起用于MVC5应用程序。对于创建新供应商实体的控制器操作,我有以下内容: [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> Create([Bind(Include = "Id,vendor_name,created_date,created_by,modified_date,modified_by")] INV_VENDORS iNV_
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create([Bind(Include = "Id,vendor_name,created_date,created_by,modified_date,modified_by")] INV_VENDORS iNV_Vendors)
{
if (!db.INV_VENDORS.Any(m => m.VENDOR_NAME == iNV_Vendors.VENDOR_NAME))
{
//decimal id = db.INV_VENDORS.Last().ID + 1;
//iNV_Vendors.ID = db.INV_VENDORS.Last().ID + 1;
iNV_Vendors.CREATED_DATE = DateTime.Now;
iNV_Vendors.CREATED_BY = System.Environment.UserName;
ModelState.Clear();
TryValidateModel(iNV_Vendors);
if (ModelState.IsValid)
{
db.INV_VENDORS.Add(iNV_Vendors);
await db.SaveChangesAsync();
return RedirectToAction("Index");
}
}
else
{
ModelState.AddModelError("vendor_name", "The Vendor [" + iNV_Vendors.VENDOR_NAME + "] already exists in the table.");
}
return View(iNV_Vendors);
}
在我的DAL文件夹的my INV_VENDORS类中,我尝试为我的ID字段指定[DatabaseGenerated]选项,但在尝试创建新的供应商实体时仍然收到相同的错误:
通过测试,Entity Framework似乎正在自动将控制器代码中的iNV_Vendors.ID值设置为0,这导致了复制错误-该表当前已包含ID为1-23的值
是否有人知道如何通过linq查询数据库中表中的最后一个ID值,以便我可以将iNV_Vendors.ID指定为返回值+1?或者,这是一个坏主意吗?通过EF获取最后一个id并手动设置它是一个非常坏的主意,因为它肯定会在并发请求时失败 由于Oracle不支持autoincrement,您应该使用本文中提到的触发器解决方法,它实际上与您当前的实现有点不同
您是否直接在数据库上测试了insert,而没有指定Id列值 实体框架未将该值设置为0。Decimal是一种值类型,因此默认为0。我明白了。我仍然不知道为什么这个字段被定义为十进制。我使用实体框架设计器选择我的表并自动生成DAL类,这使得int ID字段在类中显示为十进制。并且您确定ID是您唯一的PK,即不是具有供应商名称的复合键?等等,您提到使用设计器创建类。。。这是代码优先还是数据库优先?我认为您不能先将DatabaseGenerated属性与数据库一起使用。。。您必须这样做:我已经测试了手动插入数据库,并确认在使用TOAD for Oracle时不需要指定ID列值。我看了你的链接,但我不太明白与我已经准备好的触发器相比有什么不同?是的,我的错,它们是一样的。您是否尝试分析EF正在生成的实际查询?我不确定实际的查询,但在wait db.saveChangesSync之前添加的iNV_供应商有以下功能:CREATED_BY:{Me}CREATED_DATE:{4/3/2015 8:43:57 AM}ID:0 | MODIFIED_BY:null | MODIFIED_DATE:null | VENDOR| NAME:TEST?看起来不错。使用profiler检查实际查询,这将非常有帮助。什么是/如何使用profiler?
CREATE OR REPLACE TRIGGER INV_VENDORS_TRG
BEFORE INSERT
ON INVENTORY.INV_VENDORS
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
BEGIN
-- For Toad: Highlight column ID
:new.ID := INV_VENDORS_SEQ.nextval;
END INV_VENDORS_TRG;
/
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public decimal ID { get; set; }