我正在使用Entity Framework Code First在ASP.NET MVC 4中構建應用程式,為簡單起见,我从具有Guid,DateCreated,LastEditDate的BaseEntity繼承了將儲存在資料庫中的所有模型.以及其他類似的有用屬性.現在,我知道我可以告诉EF這樣對映這些繼承的屬性:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().Map(m =>
{
m.MapInheritedProperties();
});
modelBuilder.Entity<Product>().Map(m =>
{
m.MapInheritedProperties();
});
}
尽管對每个專案都要這樣做似乎很愚蠢.有没有办法可以將此規則應用於一个實體中的所有實體?
- 5月前1 #
- 5月前2 #
這樣的對映-稱為Table-Per-Concrete-Type(TPC)繼承對映-仅在您確實想利用多型性時才有意義,例如,如果您想 載入說10
BaseEntity
的列表 物件並期望實際型別得到實現,因此列表包含3个User
實體和7Product
實體。這樣的查詢在您的應用程式中是否会与業務相關? 看着你的
BaseEntity
我只能看到查詢所有在特定日期建立的物件,例如,無論物件具有哪種型別(如果它是从BaseEntity
派生的) ),可能会很有用.你需要那个吗? 還請記住,這樣的查詢將多麼複雜. SQL必须查詢資料庫中几乎所有的表,然後合並結果。仅当繼承對映具有實際業務含義時才使用繼承對映(例如:
Person
本身和Employee
具有有意義的屬性,例如地址,電话,電子郵件等 来自Person
並添加一个Salary
和HiredDate
财产等)。在您的情况下,我会使用
BaseEntity
仅作為實體類的基本型別,並且完全不為该類指定任何對映. EF仍將對映繼承的屬性,但作為User
的一部分 和Product
實體等,而不是自己的實體.我什至不稱其為"基础 Entity "但是...我不知道...也许是EntityBase
(意味着:所有實體的基(類),但不是實體本身)。
已经正確地指出,在這種特定情况下不需要进行全域性對映,因為EF会為每个个體對映屬性 键入,只要您不做
BaseEntity
模型的一部分。但是您的問题標题說明得比较笼統,是的,如果您通過
註意:EntityTypeConfiguration
配置對映,則可以指定全域性對映規則 s.看起来可能像這樣:从Entity Framework 6開始,這些對映中的某些對映也可以通過自定義代碼優先約定来解決:http://romiller.com/2013/01/29/ef6-code-first-configuring-unmapped-base-types/