实体框架6 - 如何使用Collection子属性更新实体

时间:2015-07-09 02:46:19

标签: c# asp.net-mvc entity-framework asp.net-mvc-5 entity-framework-6

我是实体框架的新手,所以请耐心等待。

我在DAL中有这些实体

    public class TimeSheet
    {
        [Key]
        public int TimeSheetID { get; set; }
        public DateTime SignIn { get; set; }
        public DateTime SignOut { get; set; }

        public virtual ICollection<TimeSheetDetail> TimeSheetDetails { get; set; }
    }

    public class TimeSheetDetail
    {
        [Key]
        public int TimeSheetDetailID { get; set; }
        public string Description { get; set; }
    }

我在尝试更新记录时遇到以下错误(附加&#39; Model&#39;的实体失败,因为同一类型的另一个实体已经具有相同的主键值),我的更新代码如下:

public class TimeSheetService : ITimeSheetService
{
    private readonly IRepository<TimeSheet> _repo;
    private readonly IRepository<TimeSheetDetail> _repo2;

    public void EditTimeSheet(TimeSheet obj)
    {
        _repo.Update(obj); //Update TimeSheet <-- error here

        //loop TimeSheetDetails
        foreach (var item in obj.TimeSheetDetails)
        {
            //Insert
            if (_repo2.GetById(item.TimeSheetDetailID) == null)
            {
                _repo2.Insert(item);
            }
            //Update
            else
            {
                _repo2.Update(item);
            }
        }

        foreach (var item in _repo.GetById(obj.TimeSheetID).TimeSheetDetails)
        {
            //Delete
            if (!obj.TimeSheetDetails.Any(w => w.TimeSheetDetailID == item.TimeSheetDetailID))
            {
                _repo2.Delete(item.TimeSheetDetailID);
            }
        }
    }
}

我的通用存储库:

    public void Insert(T obj)
    {
        _dbSet.Add(obj);
    }

    public void Update(T obj)
    {
        _dbSet.Attach(obj);
        _dbContext.Entry(obj).State = EntityState.Modified;
    }

    public void Delete(T obj)
    {
        _dbSet.Remove(obj);
    }

我环顾四周,得到的答案很复杂。所以我的问题是:

  1. 如何实现这个目标?
  2. 这是否可以接受?还有其他更简单的方法吗?
  3. 任何帮助将不胜感激。

0 个答案:

没有答案