EF Code first - добавление записи «многие ко многим», ничего не сохраняется - PullRequest
0 голосов
/ 31 января 2012

Сначала я использую код EF 4.3. У меня есть отношения многие ко многим. Я пытаюсь в коде присоединить и сохранить мои связанные записи из массива идентификаторов. В идеале я не хочу загружать эти связанные объекты, прежде чем сохранить их ...

Вот моя модель - Установщики могут иметь много MasterInstances:

public class MasterInstance
{
    public int MasterInstanceId { get; set; }
    [Required] public string HostName { get; set; }
    [Required] public string Name { get; set; }
    [Required] public string ConnectionString { get; set; }
    public virtual ICollection<MasterInstanceLocation> MasterInstanceLocations { get; set; }
    public ICollection<Installer> PermittedInstallers { get; set; }
}

public class Installer
{
    public int InstallerId { get; set; }
    [Required] public string UserName { get; set; }
    [Required] public string Password { get; set; }
    public ICollection<MasterInstance> PermittedMasterInstances { get; set; }
}

В своем коде я пытаюсь прикрепить master instances к installer:

installer.PermittedMasterInstances = new List<MasterInstance>();
foreach (var permittedMasterInstanceId in installerModel.SelectedMasterInstances)
{
    var masterInstance = new MasterInstance {MasterInstanceId = permittedMasterInstanceId};
    context.MasterInstances.Attach(masterInstance);
    installer.PermittedMasterInstances.Add(masterInstance);
}

context.Entry(installer).State = EntityState.Modified;
context.SaveChanges();

Но .. В таблицу ссылок ничего не пишется :( Есть идеи почему?

EDIT

Единственное, что работает, это довольно неприятное решение ... Это единственный способ?

foreach (var permittedMasterInstanceId in installerModel.SelectedMasterInstances)
{
    var masterInstance = context.MasterInstances.Single(mi => mi.MasterInstanceId == permittedMasterInstanceId);
    masterInstance.PermittedInstallers = new List<Installer>();
    context.MasterInstances.Attach(masterInstance);
    masterInstance.PermittedInstallers.Add(installer);
    installer.PermittedMasterInstances.Add(masterInstance);
}

1 Ответ

1 голос
/ 31 января 2012

Хорошо, проблема была в том, что я не прикреплял свой объект установщика к контексту ...

Это работает:

var installer = installerModel.Installer;
context.Installers.Attach(installer);

foreach (var permittedMasterInstanceId in installerModel.SelectedMasterInstances)
{
    if (!installer.PermittedMasterInstances.Any(pmi => pmi.MasterInstanceId == permittedMasterInstanceId))
    {
        var masterInstance = new MasterInstance {MasterInstanceId = permittedMasterInstanceId};
        context.MasterInstances.Attach(masterInstance);
        installer.PermittedMasterInstances.Add(masterInstance);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...