C# 获取实体框架表中的最后一个ID,以便将新记录设置为LastID+1?

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_

我将实体框架与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_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; }