2017-02-13 12 views
1

с использованием .net 4.5.2, MVC5, Entity рамки 6 и Visual Studio 2015.Entity Framework Обновление Не Сохранение

У меня есть хранилище шаблон создан с 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(); 
} 

Тогда мой Repository обновление метод.

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» не удалось, так как другой объект того же типа, уже имеет один и тот же значение первичного ключа. Это может произойти при использовании метода «Закрепить» или установить состояние объекта в «Без изменений» или «Modified», если какие-либо объекты в графе имеют конфликтующие значения ключей и т.д. ...

Многие ко многим моделям, userlist model.

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

Вопрос почему это обыкновение обновление, и почему его ошибки, если я пытаюсь установить состояние в модифицирована.

+0

Строка 'userBRList = item' просто заменяет сущность, но не отслеживается вашим контекстом. – DavidG

+0

Итак, вместо этого мне нужно заполнить его вручную, как userBrList.name = item.Name? – lemunk

+0

Это один из способов сделать это. Вы также можете сделать это, не получив сначала сущность из базы данных, а затем добавив 'item' – DavidG

ответ

1

Поскольку вы используете 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; 
    } 

Приветствия

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

, если это не решит вашу проблему. Вы найдете метод вместо 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; 
} 
Смежные вопросы