2

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

4

1 に答える 1

1

今のところ...他の解決策が見つからない場合は、次のSQLスクリプトを実行して空のレコードを挿入します。このようにして、ユーザーがレコードを編集したいときにレコードが存在することを確認し、保存する前にレコードが存在することを確認する必要はありません。たぶん、いくつかの厄介なLinqクエリを回避することもできます。

このSQL2の場所を実行するだけで済みます。新しい言語または新しい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
于 2011-01-17T23:55:47.130 に答える