2016-01-28 2 views
0

Я кодирую приложение MVC, которое содержит пару ассоциаций «многие-ко-многим». Одна из них - это обычная ассоциация Role <---> Account. В основном у меня есть таблица, полная предопределенных Ролей, из которых пользователь может выбрать. Я создал ViewModel, который содержит мою модель сущности и несколько коллекций, которые я использую, одна из них - коллекция ролей. Затем я заполняю свою форму Create этими значениями и снова разрешаю их на [HttpPost] Создайте действие.«Объект сущности не может ссылаться на несколько экземпляров IEntityChangeTracker» при добавлении объекта в контекст

Вот соответствующий код:

ViewModel Класс: Код

public class AccountsViewModel 
{ 
    public Accounts Account { get; set; } 

    public List<Roles> RolesList { get; set; } 
} 

Контроллер:

public ActionResult Create() 
{ 
    AccountsViewModel viewModel = new AccountsViewModel(); 
    viewModel.RolesList = rolesService.GetAllRoles(); 
    return View(viewModel); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(AccountsViewModel viewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     foreach(Roles role in viewModel.RolesList) 
     { 
      if (role.IsSelected) 
      { 
        Roles selectedRole = rolesService.GetRole(role.Id); 
        viewModel.Account.Roles.Add(selectedRole); 
      } 
     }   
     //Some more code here...   
     accountsService.AddAccount(viewModel.Account); 
    } 
} 

класс Таможенные услуги (accountsService)

public void AddAccount(Accounts newAccount) 
{ 
    //AppDataContext is an instance of <Model>Container 
    AppDataContext.AccountsSet.Add(newAccount); 
    AppDataContext.SaveChanges(); 
} 

А мой Создать Вид:

<div class="form-group"> 
    @Html.LabelFor(model => model.Account.Roles, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @for (int i = 0; i < Model.RolesList.Count; i++) 
     { 
      @Html.HiddenFor(m => m.RolesList[i].Id) 
      @Html.CheckBoxFor(m => m.RolesList[i].IsSelected) 
      @Html.LabelFor(m => m.RolesList[i].IsSelected, Model.RolesList[i].Name) 
      <br /> 
     } 
    </div> 
</div> 

Теперь к моей актуальной проблеме, каждый раз, когда я пытаюсь добавить новый объект Accounts, я получаю ошибку "An entity object cannot be referenced by multiple instances of IEntityChangeTracker." я уже смотрел на несколько постов, найденных в Интернете, но я не могут действительно связывать их с возможными ошибками, которые я сделал в своем коде. Так может кто-нибудь помочь мне здесь?

+0

показать след следа. – tdbeckett

+0

Возможно, он пытается добавить дублирующий элемент в базу данных – erikscandola

+0

Вы видите это: http://stackoverflow.com/questions/10191734/entity-object-cannot-be-referenced-by-multiple-instances-of-ientitychangetracker Как вы создаете свой контекст? И это похоже на ваш вопрос: http://stackoverflow.com/q/694625/1566267 –

ответ

0

Проблема в том, что роли newAccount по-прежнему связаны с контекстом roleService. Сущность может быть привязана только к одному контексту за раз.

Вы можете либо позвонить context.Entity(...).Detach() отделить объект, или даже лучше получить роль с отслеживанием изменений инвалидов и без создания прокси-сервера, так как это даст вам огромный прирост скорости на:

context.Configuration.AutoDetectChangesEnabled = false; 
context.Configuration.ProxyCreationEnabled = false; 

Еще лучше создать новый контекст внутри используемого блока внутри rolesService.GetRole(...) таким образом, что ваш контекст не будет загрязнен (и медленным) с течением времени.

+0

, так что вы пытаетесь сказать, что если я что-то изменил в «текущем» контексте, мне нужно либо утилизировать, либо снова создать экземпляр, либо использовать один и тот же контекст для всех моих пользовательских классов обслуживания? – LeonidasFett

+0

только одна проблема, хотя, если я удаляю/создаю контекст несколько раз во время, скажем, действия редактирования элемента, не замедлит ли он что-то еще? – LeonidasFett

+0

Вы должны либо отделить Entity от contextA, чтобы добавить его в contextB, либо отключить ProxyCreation. Контекстное создание и удаление - очень быстрая операция по сравнению с доступом к чему-либо из базы данных. – wertzui

Смежные вопросы