由于乐观并发错误,无法使用attach / entry在DB中添加/修改实体

时间:2017-02-14 22:49:54

标签: asp.net-mvc database entity-framework

  

存储更新,插入或删除语句会影响意外   行数(0)。自那以后,实体可能已被修改或删除   实体已加载。看到   http://go.microsoft.com/fwlink/?LinkId=472540了解有关的信息   理解和处理乐观并发异常。

在以下函数中(MVC操作):

    // POST: api/Day
    public void Post(int bed, DateTime date, float operatingTime)
    {
        Day currentDay = new Day()
        {
            Date = date,
            BedId = bed,
            OperatingTime = operatingTime
        };

        db.Entry(currentDay).State = EntityState.Modified;
        db.SaveChanges();
    }

Day类看起来像这样:

using System;
using System.Collections.Generic;

public partial class Day
{
    public int Id { get; set; }
    public float OperatingTime { get; set; }
    public System.DateTime Date { get; set; }
    public int BedId { get; set; }

    public virtual Bed Bed { get; set; }
}

在操作中,特定Day可能已存在,也可能尚未存在。如果它不存在或者现有的Day更新,我打算创建一个新的DayDate表格包含BedIdnames作为复合主键。

我还尝试先“附加”实体。

我是否错误地认为如果没有匹配(复合)密钥的代码,我的代码会创建一个新条目?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果找不到,您的逻辑将不会创建新条目。 EntityState.Modified将创建UPDATE语句。如果要在未找到时插入,则需要先查询数据库。我不喜欢在名为Post的方法中进行插入或更新的想法,但如果您愿意,可以尝试以下方法:

// POST: api/Day
public void Post(int bed, DateTime date, float operatingTime)
{
    Day currentDay = new Day()
    {
        Date = date,
        BedId = bed,
        OperatingTime = operatingTime
    };

    var dayExists = db.Day.FirstOrDefault(d => d.Date == date && d.BedId == bed);

    if (dayExists != null) 
    {
        // you have a record, so update it
        db.Entry(currentDay).State = EntityState.Modified;
    }
    else 
    {
        // no record found, insert one
        db.Entry(currentDay).State = EntityState.Added;
    }

    db.SaveChanges();
}