DbMigration种子序列包含多个元素

时间:2014-11-09 07:22:39

标签: c# asp.net-mvc entity-framework code-first

我有以下课程

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个不同对象的相同数据,我想添加迁移的数据,如果我有红色车,红门,我想添加红苹果,如何实现这一点?它不允许我在目前的情况下如何解决这个问题?

希望我对这个问题的解释很清楚。

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)

在搜索了这个主题后,我得出了这个结果

  1. TPH将使用discriminator字段来区分派生类
  2. TPC不依赖于discriminimintor字段,因为继承类的主键与派生类的主键相同
  3. 当试图将数据添加到目录并且我正在施加约束时(如果Name重复然后make update else create),EF无法设置鉴别器=&#39;目录&#39;因为它是TPC所以更新将失败,因为表包含其他数据&#39; General&#39;
  4. 在尝试添加映射条件时,EF不允许同时为TPC和TPH使用相同的继承类。
  5. 希望这会帮助其他人像我一样陷入同样的​​问题