多言語オブジェクトごとに2つのテーブルを作成することで、これを回避できました。つまり、NewsArticleを2つのテーブルNewsArticleText(ローカライズされたコンテンツ、言語ごとに1つのレコード、および言語のISOコードを含む)とNewsArticle(言語に依存しないデータを含む; ArticleId)に分割します。 、ImageUrlなど)3番目のテーブルLanguagesは、使用されるすべての言語とそのISOコードをプライマリキーとして作成されます。
例:
Table "NewsArticle"
-------------------
ArticleId : uniqueidentifier
<any other language-neutral fields>
Table "NewsArticleText"
-----------------------
ArticleId : uniqueidentifier (foreign key referencing the NewsArticle)
LanguageCode : varchar(6) (e.g. "en-GB", "de-CH", foreign key referencing the Languages table)
Headline : varchar(100)
BocyText : varchar(max)
<any other localized data>
Table "Languages"
-----------------
LanguageId : uniqueidentifier
LangaugeCode : varchar(6)
Name : varchar(20)
dbのクエリは、言語パラメータに基づいて行われます。たとえば、次のコードはすべての英語の記事を返します。
// get all English language articles
var news = from na in datacontext.NewsArticles
where na.Deleted == false
join nt in datacontext.NewsArticlesText
on na.ArticleId equals nt.ArticleId
where nt.LanguageCode == "en-GB"
select new NewsArticleItem
{
ArticleId = na.ArticleId,
ImageUrl = na.ImageUrl,
Headline = nt.Headline,
Abstract = nt.Abstract,
BodyText = nt.BodyText,
LanguageCode = nt.LanguageCode,
DateCreated = na.DateCreated
};
return news.ToList();