实体框架5继承生成TPT而不是TPH?

时间:2013-06-10 18:44:47

标签: entity-framework entity-framework-5

我正在尝试实现组表固有的各种表。当我从模型生成数据库时,它以每个表的类型而不是像我想要的每个继承类型的形式出现。

我有:

  1. 组设为摘要
  2. 当类型(列)=每个表的不同int
  3. 时,每个组类型表都有条件地映射到Group

    有人能指出我正确的方向,我需要做些什么来改变这种继承类型?

    编辑:根据请求通过评论这里是我为组设置的数据库,并没有任何组类型的dbset

    public DbSet<Group> Groups { get; set; }
    

    以下是生成的类:

    组:

    public abstract partial class Group
    {
        public Group()
        {
            this.GroupHierarchies = new HashSet<GroupHierarchy>();
            this.GroupHierarchies1 = new HashSet<GroupHierarchy>();
            this.NetworkActions = new HashSet<NetworkAction>();
            this.PermissionAssignments = new HashSet<PermissionAssignment>();
            this.UserProfiles = new HashSet<UserProfile>();
        }
    
        public int Id { get; set; }
        public string Name { get; set; }
        public string Acronym { get; set; }
        public string Description { get; set; }
        public Nullable<System.DateTime> CreatedDate { get; set; }
    
        public virtual ICollection<GroupHierarchy> GroupHierarchies { get; set; }
        public virtual ICollection<GroupHierarchy> GroupHierarchies1 { get; set; }
        public virtual ICollection<NetworkAction> NetworkActions { get; set; }
        public virtual ICollection<PermissionAssignment> PermissionAssignments { get; set; }
        public virtual ICollection<UserProfile> UserProfiles { get; set; }
    }
    

    其中一种群组类型:

    public partial class HoaManagementCompany : Group
    {
        public string Address { get; set; }
        public string Address2 { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string Zip { get; set; }
    }
    

    另一种群体类型,将来会有更多,但只有这两种才能让它发挥作用。

    public partial class HoaAttorney : Group
    {
        public string Address { get; set; }
    }
    

3 个答案:

答案 0 :(得分:3)

  

当我从模型生成数据库时......

您使用的是Model-First策略吗?遗憾的是,这会使您的模型难以获得TPH继承(这对于Code-First或Database-First策略来说很容易)。

(Code-First的默认继承映射是TPH,因此您不应该遇到Code-First问题。)

开箱即用TPH不适用于Model-First。 Model-First的默认继承策略是TPT,在模型设计器中有no easy way切换到TPH:

  

可以使用Model First映射到TPH继承但是你   必须编写自己的数据库生成工作流程   复杂。然后,您可以将此工作流分配给数据库   EF Designer中的生成工作流属性。更容易的选择   是使用Code First。

Microsoft还有一个额外的工具 - Entity Designer Database Generation Power Pack - 支持Model-First的TPH数据库生成工作流程。但问题是它看起来维护得不是很好(从2012年5月开始更新)并且它不支持Visual Studio 2012.但是如果你使用VS 2010,你可以试试。

答案 1 :(得分:0)

您应该只将群组DBSet用于TPH。 另外,请确保您没有将表注释添加到poco类

答案 2 :(得分:0)

尝试关注此博客,过去它对我有用。

Inheritance with EF Code First: Part 1 – Table per Hierarchy (TPH)

还讨论Table per Type (TPT)Table per Concrete class (TPC)遗传问题。