gpt4 book ai didi

c# - 多对多保存数据时的 Entity Framework

转载 作者:太空宇宙 更新时间:2023-11-03 14:23:31 26 4
gpt4 key购买 nike

我正在使用 Entity Framework CTP5。

我有这样的架构:

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

所以有4张 table 。群组一对多描述多对多文本多对一语言

my model

所以我有一个多对多关系,其中该关系还包含数据。

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

添加新语言或插入新文本时...多对多关系不会插入数据库。 (认为​​这是一个坏主意,所以最后,如果那是唯一的解决方案,我可以做到)

那么当我需要从数据库中获取特定组的所有文本时,我该如何巧妙地处理这个问题,而且如果有针对该语言的翻译,我还需要获取翻译。

我无法从翻译对象开始,因为它可能不存在。如果我从文本实体开始查询...我如何只选择一种语言而不首先获取所有语言。

 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 有一个文本列表......但是在这里......我只想要 1或 NULL,或者只是一个尚未添加到数据库中的新实体。

期待一些有趣的答案。

中风

最佳答案

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

我只需要在 2 个地方运行这个 SQL。添加新语言或新的 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

关于c# - 多对多保存数据时的 Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4709289/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com