实体框架更新未保存

时间:2017-02-13 01:55:28

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

使用.net 4.5.2,MVC5,Entity framework 6和visual studio 2015。

我有一个使用Ninject设置的存储库模式,因为我的DI是通用文件。

 private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<ApplicationDbContext>().ToSelf().InRequestScope();
        kernel.Bind<IUserBlueRayLists>().To<UserBlueRayListRepository>().InRequestScope();
        kernel.Bind<IBlueRays>().To<BlueRaysRepository>().InRequestScope();
    }  

我的上下文

 public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    public IDbSet<UserBlueRayList> UserBlueRayLists { get; set; }
    public IDbSet<BlueRays> BlueRays { get; set; }

    public new void SaveChanges()
    {
        base.SaveChanges();
    }
}

public interface IDevTestContext
{
    IDbSet<UserBlueRayList> UserBlueRayLists { get; set; }
    IDbSet<BlueRays> BlueRays { get; set; }

    void SaveChanges();
}

然后我的存储库更新方法。

public bool Update(UserBlueRayList item)
    {
        var userBRList = _db.UserBlueRayLists.FirstOrDefault(x => x.Id == item.Id);
        if(userBRList != null)
        {

            userBRList = item;
            //_db.Entry(userBRList).State = EntityState.Modified;
            _db.SaveChanges();
            return true;
        }
        return false;
    }

现在,当我通过我的控制器保存并调用存储库更新方法时,没有任何更新。

所以我用

  

_db.Entry(userBRList).State = EntityState.Modified;

但是我得到了一个错误,

  

附加信息:附加类型为&#39; myapp.Models.UserBlueRayList&#39;的实体。失败,因为同一类型的另一个实体已具有相同的主键值。使用&#39;附加&#39;方法或将实体的状态设置为“未更改”#39;或者&#39;修改&#39;如果图中的任何实体具有冲突的键值......等等

多对多模型,用户列表模型。

public class UserBlueRayList
{
    public UserBlueRayList()
    {
        this.BlueRays = new HashSet<BlueRays>();
    }

    [Key]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Description { get; set; }

    [Required]
    public string UserId { get; set; }

    public virtual ICollection<BlueRays> BlueRays { get; set; }
}

public class BlueRays
{
    public BlueRays()
    {
        this.UserBlueRayList = new HashSet<UserBlueRayList>();
    }

    [Key]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Description { get; set; }


    public virtual ICollection<UserBlueRayList> UserBlueRayList { get; set; }
}

问题是为什么这不会更新,以及为什么如果我尝试将状态设置为修改它会出错。

2 个答案:

答案 0 :(得分:2)

由于您使用的是EF6,因此您可以尝试使用内置于EF6中的自动属性映射

public bool Update(UserBlueRayList item)
    {
        var userBRList = _db.UserBlueRayLists.FirstOrDefault(x => x.Id == item.Id);
        if(userBRList != null)
        {
            _dbContext.Entry(userBRList).CurrentValues.SetValues(item); 
            return return _dbContext.SaveChanges() > 0;
        }
        return false;
    }

干杯

答案 1 :(得分:2)

第一个解决方案你必须像那样更新

public bool Update(UserBlueRayList item)
{
    var userBRList = _db.UserBlueRayLists.FirstOrDefault(x => x.Id == item.Id);
    if(userBRList != null)
    {

        userBRList.Name = item.Name;
         //value assign to other entity
        _db.Entry(userBRList).State = EntityState.Modified;
        _db.SaveChanges();
        return true;
    }
    return false;
}

如果这不能解决您的问题,您可以使用Find方法而不是FirstorDefault()

public bool Update(UserBlueRayList item)
{
var userBRList = _db.UserBlueRayLists.Find(x => x.Id == item.Id);
if(userBRList != null)
{

    userBRList.Name = item.Name;
     //value assign to other entity
    _db.Entry(userBRList).State = EntityState.Modified;
    _db.SaveChanges();
    return true;
}
return false;
}