Entity framework EntityFramework如何不映射类而映射它';继承的财产

Entity framework EntityFramework如何不映射类而映射它';继承的财产,entity-framework,ef-code-first,mapping,Entity Framework,Ef Code First,Mapping,我们在web mvc应用程序(StdWebApp)中使用EntityFramework 6.1和CodeFirst。现在,我们要创建此应用程序的新自定义版本(CustomWebApp)。 CustomWebApp将使用标准应用程序的大部分代码,在其域模型中,它将扩展Person类。 在CustomDomain中,我们实现了一个新的DbContext,它必须连接到定制应用程序(CustomSqlDb)的数据库 在(C#)代码中,域和CustomDomain中都有一个人是没有问题的。但是,我们无法为

我们在web mvc应用程序(StdWebApp)中使用EntityFramework 6.1和CodeFirst。现在,我们要创建此应用程序的新自定义版本(CustomWebApp)。 CustomWebApp将使用标准应用程序的大部分代码,在其域模型中,它将扩展Person类。 在CustomDomain中,我们实现了一个新的DbContext,它必须连接到定制应用程序(CustomSqlDb)的数据库

在(C#)代码中,域和CustomDomain中都有一个人是没有问题的。但是,我们无法为自定义DbContext中的人员设计映射,该映射将:

  • 创建一个“Person”表
  • 包含来自“CustomDomain.Person”和“Domain.Person”的字段
  • 我们尝试了一些类似的变体:

       modelBuilder.Entity<Person>().Map(m =>
            {
                m.MapInheritedProperties();
                m.ToTable("Person");
            }
       );
    
    public DbSet<CustomDomain.Person> People {get; set;}
    
    modelBuilder.Entity().Map(m=>
    {
    m、 MapInheritedProperties();
    m、 可转让(“人”);
    }
    );
    
    用这份文件作为我们的灵感

    但英孚抱怨说,这个简单的名字是平等的。 显然,我们可以将“CustomDomain”中的“Person”重命名为“PersonCustom”,但如果将来我们不得不再次这样做,例如“PersonCustomExtraSpecial”等,这可能会导致许多愚蠢的名字

    有人吗

    更新 我们尝试了mr100建议的解决方案,下面是完整的代码:

    namespace Domain
    {
    
        public class Person
        {
           public int Id { get; set; }
           public string Stuff { get; set; }
        }
    }
    
    namespace CustomDomain
    {   
        public class Person : Domain.Person
        {
          public string ExtraStuff { get; set; }
        }
    }
    
    namespace CustomDomain
    {
        public class DbModel : DbContext
        {
           DbSet<CustomDomain.Person> Persons { get; set; }
           protected override void OnModelCreating(DbModelBuilder modelBuilder)
           {
               modelBuilder.Entity<CustomDomain.Person>().Map(m => m.ToTable("Person"));
           }
        }
    }
    
    命名空间域
    {
    公共阶层人士
    {
    公共int Id{get;set;}
    公共字符串填充{get;set;}
    }
    }
    命名空间自定义域
    {   
    公共类人员:域.人员
    {
    公共字符串{get;set;}
    }
    }
    命名空间自定义域
    {
    公共类DbModel:DbContext
    {
    DbSet Persons{get;set;}
    模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
    {
    modelBuilder.Entity().Map(m=>m.ToTable(“Person”);
    }
    }
    }
    
    这仍然会导致错误

    类型“CustomDomain.Person”和类型“Domain.Person”都具有相同的简单名称“Person”,因此不能在同一模型中使用。给定模型中的所有类型都必须具有唯一的简单名称。在Code First fluent API中使用“NotMappeAttribute”或调用Ignore可从模型中显式排除属性或类型

    因此,我们添加了以下代码:

    namespace CustomDomain
    {
        public class DbModel : DbContext
        {
            DbSet<CustomDomain.Person> Persons { get; set; }
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
               modelBuilder.Ignore<Domain.Person>();
               modelBuilder.Entity<CustomDomain.Person>().Map(m => m.ToTable("Person"));
            }
        }
    }
    
    命名空间自定义域
    {
    公共类DbModel:DbContext
    {
    DbSet Persons{get;set;}
    模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
    {
    Ignore();
    modelBuilder.Entity().Map(m=>m.ToTable(“Person”);
    }
    }
    }
    

    仍然是相同的结果。

    要实现这一点,CustomWebApps中的DbContext类应具有如下定义的属性人员:

       modelBuilder.Entity<Person>().Map(m =>
            {
                m.MapInheritedProperties();
                m.ToTable("Person");
            }
       );
    
    public DbSet<CustomDomain.Person> People {get; set;}
    
    public DbSet-People{get;set;}
    
    无财产:

    public DbSet<Domain.Person> People {get; set;}
    
    public DbSet-People{get;set;}
    
    即使它来自StdWebApp DbContext类,CustomWebApp DbContext类也可以从中派生(如果您是这样的话)。此外,您还可以正确设置表名:

    modelBuilder.Entity<Person>().ToTable("Person");
    
    modelBuilder.Entity().ToTable(“个人”);
    
    @Humayun Awesome edit;-)我们尝试了您的答案,请参阅更新的问题,但仍会出现相同的错误。如果它对你有效,你能在你的答案中包含示例代码吗?不幸的是,你将要实现的目标在当前版本的EF中是不可能的。EF不识别名称空间,并且它总是在模型中包含基类型,您不能使用Ignore将其删除。检查此链接以供参考:那里的家伙们声明EF团队最终将在第7版中删除此限制。目前,恐怕解决您问题的唯一办法是将Domain.Person或CustomDomain.Person类重命名为其他名称。