Dur*_*n81 7 c# multilingual linq-to-entities entity-framework entity-framework-4
我正在从头开始构建一个新项目.我创建了一个db,我一直在应用db结构,我用一个简短的不言自明的例子来解释:
表项 - >(Id,Name) - >包含一般信息
表ItemInfo - >(Item_Id,语言,描述) - >包含语言相关信息.
Id和Item_Id与外键关系连接.
我的想法是以一种最终只使用通过实体框架填充的单个POCO对象"Item"的方式对其进行建模.此对象仅包含公共属性:Id,Name和Description.语言将使用此对象隐藏到代码中,对象本身应负责根据包含该语言的全局变量提供正确的描述.
我已经尝试了几种方法来做到这一点并且总是遇到问题,因为实体框架不允许这种情况.我总是必须检索所有语言的信息,而不仅仅是当前语言或使用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;}
}
}
Run Code Online (Sandbox Code Playgroud)
使用此代码,我将ItemInfo中的其他属性添加到Item,并根据我的要求选择了正确的语言.你认为这是一个很好的解决方案吗?你会如何解决这个问题呢?
但是,运行sql profiler我可以看到2个不同的sql查询用于填充Item对象,一个查询Item表,另一个查询ItemInfo.
使用单个查询在两个表之间进行连接可以实现相同的方案吗?(我担心长期性能受到影响,这也就是我如何在没有ORM的情况下做到这一点).
任何建议都会受到欢迎,我有多年的编程经验,但我是Entity Framework和ORMs的新手.
请帮忙.
您没有展示如何获取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()
};
Run Code Online (Sandbox Code Playgroud)
(已编辑使用FirstOrDefault
而不是Single
- 请参阅@Craig Stuntz的评论讨论)
这将返回所有的列表Items
- 您可以添加一个Where
子句来过滤.
或者你可以反过来获取它(从开始ItemInfo
):
ItemInfo itemInfo = context.
ItemInfoes.
Include(info => info.Item).
SingleOrDefault(info => info.Language == YourGlobalLang &&
info.Item.Id == itemIdToFetch);
Run Code Online (Sandbox Code Playgroud)
之后,您可以访问项目对象本身:
Item item = itemInfo.Item;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2160 次 |
最近记录: |