Entity Framework Вставьте в экземпляр многие ко многим с уже существующими регистрами, создавая дублированные регистры - PullRequest
0 голосов
/ 02 октября 2018

Ну, у меня есть эта конфигурация:

  • Элемент имеет 0 или много Групп и 0 или много Пользователи (таблицы GroupsItem и UsersItem )
  • Группы и Users внутри 0 или много Items
  • Группы и Пользователи независимо создаются в приложении

Вот проблема: Когда я пытаюсь вставить новый Элемент Я должен указать, каковы его Группы и Пользователи (которые уже существуют).Когда это происходит, таблицы GroupsItem , UsersItem и Item заполняются правильно, но у меня есть дублированные регистры в Groups и Пользователи .

Вот мой краткий код:

Элемент :

public class Item {
    public ICollection<Groups> GROUPS{ get; set; }
    public ICollection<Users> USERS{ get; set; }
}

Группы : ( Пользователи имеют одинаковую структуру)

public class Groups{
    public ICollection<Item> ITEM { get; set; }
}

Вставка нового Item :

public static void InsertingItem(){
    Item example = new Item(){
        GROUPS = AlreadyExistingGroup()
    }
    using (myDbContext db = new myDbContext()){
        db.ITEMS.Add(example);
        db.SaveChanges();
    }
}

И это все.AlreadyExistingGroup - это метод, который возвращает List<Groups>, который заполняется группами, которые уже существуют в базе данных. Метод, который объединяет эти группы, представляет собой одну функцию, которая объединяет одну группу, но вызывается несколько раз:

public static Groups FetchGroups(int id) {
        try {
            using (myDbContext db = new myDbContext ()) {
                Groups group = db.GROUPS.Where(x => x.CODGROUP == id).FirstOrDefault();
                return group;
            }
        } catch (Exception e) {
            return null;
        }
      }

Что я делаю неправильно, что вызывает дублирование регистров в группах и пользователях?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Судя по вашим разъяснениям в комментариях, кажется, что вы используете неотслеживаемые (неприкрепленные) Group и User сущности при установке их в новую Item сущность.Когда объект Item добавляется к Items DbSet, он отслеживается как EntityState.Added.EF будет распространять граф объектов Item и, когда он сталкивается с неотслеживаемыми связанными сущностями (т.е. установленными вами коллекциями User и Group), он будет также отслеживать ранее неотслеживаемые сущности как EntityState.Added, таким образомвставка новых записей в хранилище данных для этих объектов.

Чтобы решить проблему, вручную присоедините эти связанные объекты как EntityState.Unchanged.Например, вы можете использовать метод DbContext.AttachRange

db.AttachRange( existingGroups );

Или для объекта, который вы также можете присоединить с помощью метода DbContext.Entry

db.Entry( existingGroup ); // this tracks the entity as Unchanged
0 голосов
/ 02 октября 2018

Редактирование моего ответа с правильным решением, к которому мы пришли в комментариях:

Проблема заключается в двух разных DbContexts в коде:

public static void InsertingItem(){
    Item example = new Item(){
        // DbContext #1 is created in this method
        GROUPS = AlreadyExistingGroup(); 
    }
    // And this is DbContext #2
    using (myDbContext db = new myDbContext()){
        db.ITEMS.Add(example);
        db.SaveChanges();
    }
}

Исправление - использовать один и тот же DbContext как для поиска, так и для вставки нового элемента.Пример:

public static void InsertingItem(){
    using (myDbContext db = new myDbContext()){
        Item example = new Item(){
            // refactor the AlreadyExistingGroup method to accept a DbContext, or to move
            // the code from the method here
            GROUPS = AlreadyExistingGroup(dbContext) ;
        }
        db.ITEMS.Add(example);
        db.SaveChanges();
    }
}

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

public class Groups{ public Item ITEM { get; set; } // }

Кроме того, и я не голосую и не критикую, а всего лишь предложение: полезно также публиковать конфигурацию модели при задании вопросов EF.Потому что ... хорошо ... EF может быть привередливым.Ака:

modelBuilder.Entity<Group>() .HasMaxLength(50) .WhateverElseYouConfigure();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...