У меня есть следующие классы
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?
другими словами, у меня могут быть одинаковые данные для двух разных объектов, и я хочу добавить данные о добавлении миграции, как это сделать, если у меня есть, например, красный автомобиль, красная дверь, и я хочу добавить красное яблоко, например? это не позволит мне в моей нынешней ситуации, как решить эту проблему?
Надеюсь, мое объяснение этой проблемы было ясным.
попробуй это:
//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
после поиска по этому вопросу я пришел к такому результату
надеюсь, это поможет другим упасть в той же проблеме, как я