表每个具体类型(TPC)映射在EF4.4 [英] Table per Concrete Type (TPC) Mapping in 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屋!