2

我正在使用实体框架 CTP5。

我有这样的架构:

  • 一个组包含许多文本描述。
  • 一个文本描述有很多文本。
  • 一种语言有很多文本。

所以有4张桌子。 分组一对多描述多对多文本多对一语言

我的模型

所以我有一个多对多的关系,该关系也包含数据。

Text 和 TextDescription 的定义(因为我们可以在 Id 上查询 Group 和 Languages 我没有在这里添加它们)

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 实体查询......我如何只选择一种语言而不首先获取所有语言。

 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。然后我可以处理我的代码并避免延迟加载。

但是我可以在实体框架中获得相同的行为吗?我可以看到 EF4 进行映射可能会出现一些问题......因为我要从 TextDescriptions 到 Texts ......并且 TextDescriptions 有一个文本列表......但是在这里......我只想要 1或 NULL,或只是尚未添加到数据库中的新实体。

期待一些有趣的答案。

mvh

4

1 回答 1

1

现在......如果没有找到其他解决方案,我将运行以下 SQL 脚本来插入空记录。这样,当用户想要编辑它并且不必在保存之前确保它在那里时,我确定记录在那里。也许还可以避免一些讨厌的 Linq 查询。

我只需要运行这个 SQL 2 的地方。添加新语言或新文本描述时。

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 回答