3

EF 4.4 で TPC 設計を実現しようとしています。

既存のテーブルに既にマップされているクラスのセットがあり、同じ構造を持つ新しいセットを追加し、それらを別のテーブルにマップし、ID をばらばらにします。

したがって、これは古いクラスのほとんどの新しい設計です (これから追加する新しいタイプの階層は除きます)。

public abstract class HierarchyLevel
{
   public virtual int Id { get; set; }
   public string Name { get; set; }
}

public class MainHierarchyLevel : HierarchyLevel { }

public abstract class HierarchyItem
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual HierarchyLevel Level { get; set; }
}

public class MainHierarchyItem : HierarchyItem { }

public abstract class HierarchyTreeItem
{
    public int Id { get; set; }
    public virtual HierarchyTreeItem ParentTreeItem { get; set; }
    public virtual HierarchyItem Parent { get; set; }
    public virtual HierarchyItem Child { get; set; }
}

public class MainHierarchyTreeItem : HierarchyTreeItem { }

構成で何をしても、EFは常にテーブル名を作成します。たとえば、次のようなクエリを取得します

SELECT 
[Extent1].[Id] AS [Id], 
'0X0X' AS [C1], 
[Extent2].[Name] AS [Name], 
[Extent2].[Description] AS [Description], 
[Extent2].[Level_Id] AS [Level_Id]
FROM  [dbo].[HierarchyItems] AS [Extent1]
INNER JOIN [dbo].[HierarchyItems1] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]

HierarchyItems1 は EF によって作成されます。

これは、私が構成で行っていることの例です:

public class HierarchyItemsConfiguration : EntityTypeConfiguration<HierarchyItem>
{
    public HierarchyItemsConfiguration()
    {
        Property(hierarchyItem => hierarchyItem.Id).HasColumnName("Id").IsRequired();
        Property(hierarchyItem => hierarchyItem.Name).HasColumnName("Name").IsRequired();
        Property(hierarchyItem => hierarchyItem.Description).HasColumnName("Description").IsOptional();
    }
}

public class MainHierarchyItemsConfiguration : EntityTypeConfiguration<MainHierarchyItem>
{
    public MainHierarchyItemsConfiguration()
    {
        Map(mb =>
                {
                    mb.MapInheritedProperties();
                    mb.ToTable("HierarchyItems");
                });
        ToTable("HierarchyItems");
        HasKey(hierarchyItem => hierarchyItem.Id);
        HasRequired(hierarchyItem => hierarchyItem.Level).WithMany().Map(e => e.MapKey("Level_Id"));
    }
}

これを正しく構成する方法についてのアイデアはありますか?

ありがとうございました!

4

1 に答える 1