【发布时间】:2015-12-18 13:20:12
【问题描述】:
我有一堆从其他各种类引用的简单类。例如,
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; }
}
当按照上面发布的方式使用时,Entity Framework 将创建三个表——[DraftArticles]、[Articles] 和 [Versions],其中 [Versions] 表将具有以下 extra 列—— [判别器]、[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() 应用于属性 级别的内容而不是在 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
}
...
}
有人知道这是否可以做到吗?您是否知道有任何其他方法可以重用类而无需创建额外的类和/或映射?
【问题讨论】:
-
您是说您想要一个版本表用于文章,另一个版本表用于 DraftArticles?
-
我想部分问题是我不知道你为什么要将版本分成两个表。如果版本确实不相关,那么它们应该是恰好具有相同字段的单独实体。
-
你会遇到维护的噩梦,文章、草稿等都非常相似,正确的设计是只有一个表并设置一个状态字段,上面写着“草稿”、“已发布”,这就是每个博客的做法。如果你想实现文章和草稿之间的一对多关系,那么你可以创建一个自父子关系。
-
@Fabio -- 正确。不同文章类型的单独表格。他们只是碰巧都有版本属性。那么为什么要创建重复的类。维护头痛。
-
@Vlad274 / @Akash -- 请解释为什么“正确”的设计是将它们放在同一张表中?它们服务于不同的目的。也许我有一个用于知识库文章的“文章”表和另一个用于技术说明文章的“文章”表。并且这两种类型的文章除了具有相同的类属性之外是无关的。问题是关于避免创建不必要的(重复的)类。实际上,我认为维护具有相同确切属性的不同类更像是维护噩梦。需要多次更改。
标签: entity-framework inheritance mapping entity-framework-6