2

私はEntity Framework CTP5を使用しています。グループは、多くのtextdescriptionsが含まれてい多対多がデータを保持しているエンティティフレームワーク

  • は、私はこのようなスキーマを持っています。

  • テキスト記述には多くのテキストがあります。
  • 言語には多くのテキストがあります。

したがって、4つのテーブルがあります。 グループ一対多説明多対多のテキスト多対一言語

my model

だから私は関係もデータを保持している多対多の関係を持っています。

テキストとTextDescriptionの定義(私たちはグループや言語のためのIDを照会することができますので、私はここでそれらを追加しましたhaventは)

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; 
    } 
} 

新しい言語や新しいテキストが挿入されているいずれかの追加...多対多の関係はデータベースには挿入されません。

したがって、私がのテキストをすべて取得する必要がある場合、これをスマートな方法で処理するにはどうすればよいですか?(これは悪い考えであると思うので、唯一の解決策だと思います。をデータベースから特定のグループ用に選択するだけでなく、その言語用の翻訳がある場合は翻訳を取得します。

私は翻訳オブジェクトから始めることはできません。テキストエンティティからクエリを開始すると...すべての言語を最初に取得することなく、どの言語を選択すればよいですか?

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を取得する私の要素を与えるだろう。私はそれを私のコードを処理することができ、遅延ロードを避けることができます。

しかし、Entity Frameworkでも同じ動作ができますか。私は、EF4がマッピングを行うためにいくつかの問題があるかもしれないことを知ることができました...私はTextDesciptionsからTextsに行きます...そしてTextDesciptionsはTextのリストを持っています...しかしここ...私は1またはNULLであるか、データベースにまだ追加されていない新しいEntityだけです。

いくつかの興味深い回答を楽しみにしています。

MVH

+0

期待どおりに動作しないコードを表示する必要があります(*新しい言語を追加するか新しいテキストを挿入すると、多対多のリレーションシップがデータベースに挿入されません)。 。また、フル・オブジェクト・モデルと、流暢なAPIを皆さんに提供する必要があります。ありがとう。 –

+0

問題は、それがうまくいくように動作し、どのように動作するのだろうかということです。私は左の結合を行う方法を探しています。私はSQLでそれを表示することができますが、私はlinqでそれをやって、それ以外の場合は、多くの遅延ロードを生成するだろうかわからない。 – Syska

+0

私はEF4を使用しています...私はあなたが見たいとは思っていません。投稿された写真があなたにアイデアを与えることを願っています。たぶん私はVSで自分のモデルを作成することができます。それが役立つかどうかは分かりません。しかし、より多くの情報が必要かどうか尋ねてください。おそらく、テーブル構造のためのより良いデザインアイデア。 – Syska

答えて

1

他の解決策が見つからない場合は、今...私は空のレコードを挿入するために、フォローのSQLスクリプトを実行されるために。この方法では、ユーザーが編集したいときにレコードがそこにあることを確認しています。保存する前にそのレコードを確認する必要はありません。たぶん、いくつかの苦味Linqクエリを避ける。

私はこのSQLを2つだけ実行する必要があります。新しい言語を追加する場合、または新しいTextDesciptionを新規作成する場合。

INSERT INTO Texts 
SELECT TD.TextDescriptionId, L.LanguageId, '', 0, GETDATE(), GETDATE(), L.TwoLetterISOLanguageName 
FROM TextDescriptions TD 
INNER JOIN Languages L ON 1 = 1 
LEFT JOIN Texts T ON 
T.TextDescriptionId = TD.TextDescriptionId AND 
T.LanguageId = L.LanguageId 
WHERE TextId IS NULL 
関連する問題