我正在使用实体框架 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