【发布时间】:2014-07-16 08:07:53
【问题描述】:
在这篇文章 (What are best practices for multi-language database design?) 之后,我将所有数据库表拆分为两个:第一个表仅包含与语言无关的数据(主键等),第二个表包含每种语言的一条记录,其中包含本地化数据加上语言的 ISO 代码。两个表之间的关系是一对多的。 这里是数据模型的截图:https://dl.dropboxusercontent.com/u/17099565/datamodel.jpg
因为网站有 8 种语言,对于表“CourseCategory”中的每条记录,我在表“CourseCategoryContents”中有 8 条记录。 “Course”和“CourseContent”也是如此
然后我使用实体拆分以便只有一个实体用于课程类别,一个实体用于课程:
public class CourseCategoryConfiguration : EntityTypeConfiguration<WebCourseCategory>
{
public CourseCategoryConfiguration()
{
Map(m =>
{
m.Properties(i => new { i.Id, i.Order, i.Online });
m.ToTable("CourseCategories");
});
Map(m =>
{
m.Properties(i => new { i.LanguageCode, i.Name, i.Permalink, i.Text, i.MetaTitle, i.MetaDescription, i.MetaKeywords });
m.ToTable("CourseCategoryContents");
});
}
}
public class CourseConfiguration : EntityTypeConfiguration<WebCourse>
{
public CourseConfiguration()
{
Map(m =>
{
m.Properties(i => new { i.Id, i.CategoryId, i.Order, i.Label, i.ThumbnailUrl, i.HeaderImageUrl });
m.ToTable("Courses");
});
Map(m =>
{
m.Properties(i => new { i.LanguageCode, i.Name, i.Permalink, i.Text, i.MetaTitle, i.MetaDescription, i.MetaKeywords, i.Online });
m.ToTable("CourseContents");
});
}
}
然后用所需的语言检索课程,包括它们的类别,我这样做:
using (WebContext dbContext = new WebContext())
{
// all courses of all categories in the desired language
return dbContext.Courses
.Include(course => course.Category)
.Where(course => course.LanguageCode == lan
&& course.Category.LanguageCode == lan)
.ToList();
}
}
实体拆分适用于一对一关系,但这里我有一对多关系。
该网站有 3 种语言(“en”、“de”、“fr”)的内容(CourseCategories 和 Courses)。 EF 以正确的语言(例如英语)正确返回所有课程及其类别,但每条记录返回 3 次。这是因为我也有 3 种语言的 CourseCategory。
我想出的唯一一个可行的解决方案是避免使用“.Include(Category)”,首先以所需语言获取所有课程,然后在 foreach 循环中,为每个课程检索其语言类别。我不喜欢这种延迟加载的方式,我想一次性检索所有需要的数据。
谢谢!
【问题讨论】:
标签: linq entity-framework split entity multilingual