首頁>Program>source

我正在使用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 #

    已经正確地指出,在這種特定情况下不需要进行全域性對映,因為EF会為每个个體對映屬性 键入,只要您不做 BaseEntity 模型的一部分。

    但是您的問题標题說明得比较笼統,是的,如果您通過 EntityTypeConfiguration配置對映,則可以指定全域性對映規則 s.看起来可能像這樣:

    // Base configuration.
    public abstract class BaseMapping<T> : EntityTypeConfiguration<T>
      where T : BaseEntity
    {
      protected BaseMapping()
      {
        this.Map(m => m.MapInheritedProperties()); // OK, not necessary, but
                                                   // just an example
      }
    }
    // Specific configurations
    public class UserMapping : BaseMapping<User>
    { }
    public class ProductMapping : BaseMapping<Product>
    { }
    public class TempModelsContext : DbContext
    {
      // Add the configurations to the model builder.
      protected override void OnModelCreating(DbModelBuilder modelBuilder)
      {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Configurations.Add(new UserMapping());
        modelBuilder.Configurations.Add(new ProductMapping());
      }
      // DbSets
      ...
    }
    
    註意:

    从Entity Framework 6開始,這些對映中的某些對映也可以通過自定義代碼優先約定来解決:http://romiller.com/2013/01/29/ef6-code-first-configuring-unmapped-base-types/

  • 5月前
    2 #

    這樣的對映-稱為Table-Per-Concrete-Type(TPC)繼承對映-仅在您確實想利用多型性時才有意義,例如,如果您想 載入說10 BaseEntity的列表 物件並期望實際型別得到實現,因此列表包含3个 User 實體和7 Product 實體。

    這樣的查詢在您的應用程式中是否会与業務相關? 看着你的 BaseEntity 我只能看到查詢所有在特定日期建立的物件,例如,無論物件具有哪種型別(如果它是从 BaseEntity派生的) ),可能会很有用.你需要那个吗? 還請記住,這樣的查詢將多麼複雜. SQL必须查詢資料庫中几乎所有的表,然後合並結果。

    仅当繼承對映具有實際業務含義時才使用繼承對映(例如: Person 本身和 Employee具有有意義的屬性,例如地址,電话,電子郵件等 来自 Person 並添加一个 SalaryHiredDate 财产等)。

    在您的情况下,我会使用 BaseEntity 仅作為實體類的基本型別,並且完全不為该類指定任何對映. EF仍將對映繼承的屬性,但作為 User的一部分 和 Product 實體等,而不是自己的實體.我什至不稱其為"基础 Entity "但是...我不知道...也许是 EntityBase (意味着:所有實體的基(類),但不是實體本身)。

  • node.js:選擇適当的異步方法进行批處理,以获得最大請求數/秒
  • javascript:為什麼angularjs控製器宣告具有這種語法結構?