EntityFrameworkCTP5を使用しています。
私はこのようなスキーマを持っています:
- グループには多くのテキストの説明が含まれています。
- textdescriptionsには多くのテキストがあります。
- 言語には多くのテキストがあります。
したがって、4つのテーブルがあります。 1対多の説明多対多のテキスト多対1の言語をグループ化します。
したがって、私は多対多の関係を持っており、その関係にはデータも含まれています。
テキストとTextDescriptionの定義(グループと言語のIDを照会できるため、ここでは追加していません)
public class Text
{
public int TextID { get; set; }
public int TextDescriptionID { get; set; }
public int LanguageID { get; set; }
public string OriginalText { get; set; }
public bool IsValid { get; set; }
public DateTime Added { get; set; }
public DateTime Updated { get; set; }
public Language Language { get; set; }
public TextDescription TextDescription { get; set; }
public static Text GetMissingText(string input)
{
Text text = new Text();
text.OriginalText = "Missing: " + input;
text.IsValid = true;
text.TextDescription = new TextDescription()
{
IsStatic = true,
Name = input,
IsMultiline = false,
};
return text;
}
}
public class TextDescription
{
public int TextDescriptionId { get; set; }
public int TextDescriptionGroupId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public bool UseHtml { get; set; }
public bool IsMultiline { get; set; }
public bool IsStatic { get; set; }
public TextDescriptionGroup TextDescriptionGroup { get; set; }
public virtual ICollection<Text> Texts { get; set; }
public static TextDescription GetNewItem(int textDescriptionGroupId)
{
var item = new TextDescription();
item.Name = item.Description = "n/a";
item.UseHtml = item.IsMultiline = item.IsMultiline = false;
item.TextDescriptionGroupId = textDescriptionGroupId;
return item;
}
}
新しい言語または新しいテキストのいずれかを追加すると、多対多の関係がデータベースに挿入されません。(それは悪い考えだと思うので、結局、それが唯一の解決策であれば、私はそれを行うことができるでしょう)
したがって、データベースから特定のグループのすべてのテキストをフェッチする必要がある場合に、これをスマートに処理するにはどうすればよいですか。また、その言語のテキストがある場合は、翻訳も取得します。
翻訳オブジェクトがない可能性があるため、翻訳オブジェクトから開始できません。Textエンティティからクエリを開始した場合...最初にすべての言語を取得せずに1つの言語のみを選択するにはどうすればよいですか。
repo.Find(x =>
x.GroupId == groupId &&
x.Translation.Any(a => a.LanguageID == id.Value)
);
私はここで迷子になっています...スマートな方法はありますか...データベースにすべてのテキストをクエリする必要はありません...次に各アイテムをクエリします...翻訳があるかどうかを確認しますか?または、新しい空のものを作成します。
SQLでは、次のようにします。
SELECT TD.Name, T.OriginalText FROM TextDescriptions TD
LEFT JOIN Texts T ON TD.TextDescriptionId = T.TextDescriptionId
WHERE TextDescriptionGroupId = 41 AND ISNULL(T.LanguageId, 1) = 1
上記のSQLは、現在レコードがない場合でも要素を提供します。これらの値に対してNULLを取得します。その後、それを自分のコードで処理し、遅延読み込みを回避できます。
しかし、EntityFrameworkで同じ動作を得ることができますか?EF4がマッピングを行うのに問題があることがわかりました...TextDesciptionsからTextsに移行しているので...そしてTextDesciptionsにはテキストのリストがあります...しかしここでは...どちらか1つだけが必要ですまたはNULL、またはデータベースにまだ追加されていない新しいエンティティ。
いくつかの興味深い答えを楽しみにしています。
mvh