我有一堆简单的类,可以从其他各种类中引用。例如,
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
}
...
}
有人知道是否可以这样做吗?您是否了解重用类没有创建其他类和/或映射的其他方法?
答案 0 :(得分:2)
正如评论所暗示的那样 - 你不会喜欢这个答案,那就是你试图做一些没有多大意义的事情,所以EntityFramework不支持它。
通过说文章和草稿都有一个“版本”列表,你告诉EF两者都指的是同一个东西 - 因此是一个表。但是你说你希望他们提到不同的东西。为什么?
正如阿卡什所说,更好(更规范化)的设计将避免需要这种奇怪的结果。