Последовательность DbMigration seed содержит более одного элемента

1

У меня есть следующие классы

public class Lookup
{
    public int Id{get;set;}
    public string Name{get;set;}
    public int Order{get;set;}
}

public class CatalogType:Lookup // this was added on Add-migration "Second"
{
}

public class Catalog:Lookup
{
     public int CatalogTypeId{get;set;} // this was added on add-migration "Second"

     public CatalogType CatalogType{get;set;}
}

и у меня уже есть данные в базе данных в таблице Lookups, которые представляют группу классов поиска, таких как пол, семейные статусы, каталог и т.д., а таблица Lookups содержит строку с Name="General" которая была использована Каталогом (например, поле Discriminator = "Каталог")

в файле конфигурации внутри функции Seed я написал этот код

context.Lookups.AddOrUpdate(p => new { p.Name, **p.GetType().FullName** },
            new CatalogType
            {
                Name = "General",
                IsActive = true,
                Order = 1,
            },
            new CatalogType
            {
                Name = "Custom",
                IsActive = true,
                Order = 2,
            });
  context.SaveChanges();

Моя проблема: я попробовал первый context.Lookups.AddOrUpdate(p=>p.Name) и когда я пытаюсь сделать update-database, миграция не выполняется " sequence contains more than one element ",

Затем я попытался использовать p.GetType().Name ошибки:

Анонимный тип не может иметь несколько свойств с тем же именем.

Затем я попытался использовать p.GetType().FullName и после выполнения команды update-database получил следующую ошибку:

Выражение свойства 'p => new <> f__AnonymousType18'2 (Name = p.Name, FullName = p.GetType(). FullName)' недействительно. Выражение должно представлять свойство: С#: 't => t.MyProperty' VB.Net: 'Функция (t) t.MyProperty'. При указании нескольких свойств используется анонимный тип: С#: 't => new {t.MyProperty1, t.MyProperty2}' VB.Net: 'Функция (t) Новая с {t.MyProperty1, t.MyProperty2}'.

Я знаю, что проблема вызвана тем, что в таблице Lookups уже есть Name="General" но как сказать EntityFramework принять во внимание дискриминатор столбца при попытке метода AddOrUpdate?

другими словами, у меня могут быть одинаковые данные для двух разных объектов, и я хочу добавить данные о добавлении миграции, как это сделать, если у меня есть, например, красный автомобиль, красная дверь, и я хочу добавить красное яблоко, например? это не позволит мне в моей нынешней ситуации, как решить эту проблему?

Надеюсь, мое объяснение этой проблемы было ясным.

Теги:
entity-framework
asp.net-mvc
code-first

2 ответа

3
Лучший ответ

попробуй это:

//but two lines below in "OnModelCreating" method in your Context

 modelBuilder.Entity<Lookup>().Map<Catalog>(m => m.Requires("IsCatalog").HasValue(true));
 modelBuilder.Entity<Lookup>().Map<CatalogType>(m =>m.Requires("IsCatalog").HasValue(false));

// then :
 context.Lookups.AddOrUpdate(p => new { p.Name , p.IsCatalog},
        new CatalogType
        {
            Name = "General",
            IsActive = true,
            Order = 1,
        },
        new CatalogType
        {
            Name = "Custom",
            IsActive = true,
            Order = 2,
        });
        //context.SaveChanges(); //if you used base.OnModelCreating(modelBuilder);
        base.OnModelCreating(modelBuilder); // then you don't need to save
  • 0
    это решение создаст столбец IsCatalog внутри таблицы поиска, верно? я пытаюсь использовать уже существующий столбец Дискриминатор
  • 0
    да, если вы не указали столбец «Дискриминатор», как я использовал карту <> (вы также можете указать тип и значение) ... он создаст свой собственный дискриминатор (дискриминатор по умолчанию), в любом случае попробуйте использовать его новым {стр. Имя, p.Discriminator} .. Примечание: Тип дискриминатора по умолчанию: бит (true / false)
Показать ещё 5 комментариев
0

после поиска по этому вопросу я пришел к такому результату

  1. TPH будет работать с полем дискриминатора, чтобы различать производные классы
  2. TPC не зависит от поля дискриминатора, потому что первичный ключ унаследованного класса является одним и тем же первичным ключом производного класса
  3. при попытке добавить данные в каталог, и я устанавливаю ограничение (если имя повторяется, а затем создавайте обновление else), EF не смог установить дискриминатор = "Каталог", так как это TPC, поэтому обновление завершится неудачно, поскольку таблица содержит другие данные 'Генеральная'
  4. при попытке добавить условия сопоставления EF не разрешает использовать один и тот же унаследованный класс для TPC и TPH одновременно.

надеюсь, это поможет другим упасть в той же проблеме, как я

Ещё вопросы

Сообщество Overcoder
Наверх
Меню