表每个具体类型(TPC)映射在EF4.4 [英] Table per Concrete Type (TPC) Mapping in EF4.4

查看:141
本文介绍了表每个具体类型(TPC)映射在EF4.4的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想实现在EF 4.4的TPC设计。

I'm trying to achieve a TPC design on EF 4.4.

我有一组已经被映射到现有的表,并增加一组新的具有相同的结构,即是要被映射到不同的表,具有不相交的ID类

I have a set of classes that are already mapped to existing tables, and adding a new set with the same structure, that are to be mapped to different tables, with disjoint IDs.

因此​​,这里的pretty的多的老班新的设计(没有新的类型层次,我要补充)。

So here's pretty much the new design for the old classes (without the new type of hierarchy that I'm going to add).

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总是让一个表名了,例如:我得到这样

No matter what I do with the configuration, EF always makes a table name up, e.g. I get a query like

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

Where HierarchyItems1 is made up by EF.

下面是我在做什么与配置的例子:

Here's an example of what i'm doing with the configuration:

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"));
    }
}

如何正确配置这个任何想法?

感谢您!

推荐答案

更​​改你的配置是这样的:

Change your config like this:

public class MainHierarchyLevelConfiguration : EntityTypeConfiguration<MainHierarchyLevel>
{
    public MainHierarchyLevelConfiguration()
    {
        Map(mb =>
        {
            mb.MapInheritedProperties();
            mb.ToTable("MainHierarchyLevels");
        });
    }
}

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

public class HierarchyContext : DbContext
{
    public DbSet<MainHierarchyLevel> MainHierarchyLevels { get; set; }
    public DbSet<MainHierarchyItem> MainHierarchyItems { get; set; }


    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Configurations.Add(new MainHierarchyLevelConfiguration());
        modelBuilder.Configurations.Add(new MainHierarchyItemsConfiguration());
    }
}

当运行下面的测试程序,2个表将被创建。 - 一个用于每个的两个具体类MainHierarchyLevel和MainHierarchyItem

When running the following test program, 2 tables will be created - one for each of the two concrete classes MainHierarchyLevel and MainHierarchyItem.

using (var db = new HierarchyContext())
{

    var level = new MainHierarchyLevel { Name = "Level1" };
    level = db.MainHierarchyLevels.Add(level);

    var mh = new MainHierarchyItem { Name = "m1", Description = "m1 desc", Level = level };
    db.MainHierarchyItems.Add(mh);
    db.SaveChanges();

    var query = from m in db.MainHierarchyItems
                orderby m.Name
                select m;

    Console.WriteLine("All mains in the database:");
    foreach (var item in query)
    {
        Console.WriteLine(item.Name);
    }

    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
}

这篇关于表每个具体类型(TPC)映射在EF4.4的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆