如何在不使用继承的情况下在Entity Framework中重用一个类?

时间:2015-09-21 18:18:13

标签: entity-framework inheritance mapping entity-framework-6

我有一堆简单的类,可以从其他各种类中引用。例如,

class Version {
    // PK is Major, Minor, Build, Revision
    int Major { get; set; }
    int Minor { get; set; }
    int Build { get; set; }
    int Revision { get; set; }
}

class DraftArticle {
    int Id { get; set; }
    string Title { get; set; }
    string Description { get; set; }
    ICollection<Version> AffectedVersions { get; set; }
}

class Article {
    int Id { get; set; }
    string Title { get; set; }
    string Description { get; set; }
    ICollection<Version> AffectedVersions { get; set; }
}

class DbContext : System.Data.Entity.DbContext {
    System.Data.Entity.DbSet<DraftArticle> DraftArticles { get; set; }
    System.Data.Entity.DbSet<Article> Articles { get; set; }
}

如上所述,实体框架将创建三个表 - [DraftArticles],[Articles]和[Versions],其中[Versions]表将包含以下额外列 - [Discriminator],[DraftArticle_Id]和[Article_Id]。

我的目标是将DraftArticles和Articles的版本记录分成不同的表格。

我知道可以使用inheritance和/或ComplexType来完成,但我想避免这两种情况,因为它需要额外的类。

例如,以下添加和修改工作

// additions
class DraftArticleVersion : Version { }

class ArticleVersion : Version { }

// modifications
class DraftArticle {
    ...
    ICollection<DraftArticleVersion> AffectedVersions { get; set; }
}

class Article {
    ...
    ICollection<ArticleVersion> AffectedVersions { get; set; }
}

class DbContext : System.Data.Entity.DbContext {
    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Entity<DraftArticleVersion>().Map(m => {
            m.MapInheritedProperties();
            m.ToTable("DraftArticleAffectedVersions");
        });

        modelBuilder.Entity<DraftArticleVersion>().Map(m => {
            m.MapInheritedProperties();
            m.ToTable("ArticleAffectedVersions");
        });
    }

    ...
}

此外,在使用像AutoMapper这样的框架时,它需要额外的(重复的)映射定义。

理想情况下 ,我希望看到的是ToTable()属性级别应用的内容em>而的 Class 级别。例如,

class Version {
    // PK is Major, Minor, Build, Revision
    ...
}

class DraftArticle {
    ...
    ICollection<Version> AffectedVersions { get; set; }
}

class Article {
    ...
    ICollection<Version> AffectedVersions { get; set; }
}

class DbContext : System.Data.Entity.DbContext {
    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        // somehow apply .ToTable("DraftArticleAffectedVersions") to DraftArticle.AffectedVersions

        // somehow apply .ToTable("ArticleAffectedVersions") to Article.AffectedVersions
    }

    ...
}

有人知道是否可以这样做吗?您是否了解重用没有创建其他类和/或映射的其他方法?

1 个答案:

答案 0 :(得分:2)

正如评论所暗示的那样 - 你不会喜欢这个答案,那就是你试图做一些没有多大意义的事情,所以EntityFramework不支持它。

通过说文章和草稿都有一个“版本”列表,你告诉EF两者都指的是同一个东西 - 因此是一个表。但是你说你希望他们提到不同的东西。为什么?

正如阿卡什所说,更好(更规范化)的设计将避免需要这种奇怪的结果。