簡體   English   中英

實體框架更新未保存

[英]Entity Framework Update Not Saving

使用.net 4.5.2,MVC5,實體框架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;

但是我得到一個錯誤

附加信息:附加類型為'myapp.Models.UserBlueRayList'的實體失敗,因為相同類型的另一個實體已經具有相同的主鍵值。 如果圖形中的任何實體具有相互沖突的鍵值,則使用“附加”方法或將實體的狀態設置為“不變”或“修改”時,可能會發生這種情況。

多對多模型,用戶列表模型。

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; }
}

問題是為什么這將不會更新,並且如果我嘗試將狀態設置為修改,為什么會出錯。

由於您使用的是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;
    }

干杯

您必須像這樣更新的第一個解決方案

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM