gpt4 book ai didi

c# - 如何使用 Entity Framework 4 为多语言数据库中的 POCO 对象建模?

转载 作者:太空狗 更新时间:2023-10-29 20:22:14 24 4
gpt4 key购买 nike

我正在从头开始构建一个新项目。我创建了一个数据库,我一直在其中应用一个数据库结构,我用一个简短的不言自明的例子来解释:

Table Item -> (Id, Name) -> 包含一般信息

表 ItemInfo -> (Item_Id, Language, Description) -> 包含语言相关信息。

Id和Item_Id是外键关系。

我的想法是以一种最终只使用通过 Entity Framework 填充的单个 POCO 对象“Item”的方式对其进行建模。该对象将只包含公共(public)属性:Id、Name 和 Description。语言将隐藏到使用此对象的代码中,对象本身应负责根据包含该语言的全局变量给出正确的描述。

我已经尝试了几种方法来做到这一点,但最终总是遇到问题,因为 Entity Framework 不允许这种情况。我总是必须检索所有语言的信息,而不仅仅是当前的一种或使用 2 种不同的查询。

所以最后我开始使用的解决方案是让T4模板同时创建Item和ItemInfo,然后我手动添加了类似这样的代码:

public partial class Item
{
private ItemInfo _itemInfo = null;
private ItemInfo itemInfo
{
get
{
if (_itemInfo == null) _itemInfo = ItemInfoes.Single(p => p.Language == GlobalContext.Language);
return _itemInfo;
}
}
public Description
{
get { return itemInfo.Description; }
set { itemInfo.Description = value;}
}
}

通过这段代码,我将 ItemInfo 中的附加属性添加到 Item 中,并根据我的要求选择了正确的语言。你认为这是一个好的解决方案吗?你会如何解决这个问题?

但是,运行 sql profiler 我可以看到使用了 2 个不同的 sql 查询来填充 Item 对象,一个查询 Item 表,另一个查询 ItemInfo。

是否可以使用在 2 个表之间进行连接的单个查询来实现相同的场景? (我担心长期性能会受到影响,这也是我在没有 ORM 的情况下会怎么做)。

欢迎提出任何建议,我有多年的编程经验,但总体而言我是 Entity Framework 和 ORM 的新手。

请帮忙。

最佳答案

您没有展示如何获取 Item 对象,但通常我认为在一个查询中获取所有内容不会有问题。您有多种选择。
您可以进行投影(但不能投影到映射实体上 - 在本例中我投影到匿名对象上):

context.
Items.
Select(item => new
{
Id = item.Id,
Name = item.Name,
Description = item.
ItemInfo.
Where(info => info.Language == YourGlobalLang).
Select(info => info.Description).
FirstOrDefault()
};

(这已被编辑为使用 FirstOrDefault 而不是 Single - 请参阅与@Craig Stuntz 的评论讨论)

这将返回所有 Items 的列表 - 您可以添加 Where 子句进行过滤。

或者你可以用相反的方式获取它(从 ItemInfo 开始):

ItemInfo itemInfo = context.
ItemInfoes.
Include(info => info.Item).
SingleOrDefault(info => info.Language == YourGlobalLang &&
info.Item.Id == itemIdToFetch);

之后您可以访问项目对象本身:

Item item = itemInfo.Item;

关于c# - 如何使用 Entity Framework 4 为多语言数据库中的 POCO 对象建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4528176/

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