我有以下课程
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表包含Catalog([{1}}使用的行(即判别字段="目录")
在Seed函数里面的Configuration文件中我编写了这段代码
Name="General"
我的问题:我先尝试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
命令时出现以下错误:
属性表达式' p => new<> f__AnonymousType18`2(Name = p.Name,FullName = p.GetType()。FullName)'无效。表达方式 应该代表一个属性:C#:' t => t.MyProperty' VB.Net: '功能(t)t.MyProperty'。指定多个属性时使用 匿名类型:C#:' t =>新的{t.MyProperty1,t.MyProperty2}' VB.Net:'功能(t)新增{T.MyProperty1,t.MyProperty2}'。
我知道问题是因为Lookups表已包含update-database
但是如何告诉EntityFramework在尝试AddOrUpdate方法时考虑列鉴别器?
换句话说,我可能有2个不同对象的相同数据,我想添加迁移的数据,如果我有红色车,红门,我想添加红苹果,如何实现这一点?它不允许我在目前的情况下如何解决这个问题?
希望我对这个问题的解释很清楚。
答案 0 :(得分: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
答案 1 :(得分:0)
在搜索了这个主题后,我得出了这个结果
希望这会帮助其他人像我一样陷入同样的问题