我在配置自己的数据库时遇到问题,并且使用实体框架管理语言的相关代码隐藏。
通常,在我的旧项目中,我有一个表格,假设页面,其中包含标识单个页面的唯一行,标准信息(根本不需要翻译):< / p>
ID
Author
Date
Location
附上我有一个支持表 Pages_L (1-N),其中包含语言数据,因此为每个页面行翻译了具体的信息:
ID
ID_PAGE
LANGUAGE
Title
Description
Notes
嗯,数据库的标准配置!没有数据冗余。
问题现在变成了实体框架,因为对于我要提取的特定页面,我每次都需要进行选择:
1 - first the page (a `.Where`);
2 - than select the language (another `.Where`)
3 - finally, select the field I want (let say, `Title`)
我发现这是一个烦人的过程,因为当我进行查询时,我只需要提取固定语言的数据。我的意思是:当我的应用程序正在处理时,语言总是一个。我不会用英语提取一些,用意大利语提取一些,用法语提取一些,等等。
所以我想要实现它是整个上下文的一种“起始语言点”。 在后期阶段,我只需要这样做:
Pages.Where(p=>p.ID==myID).FirstOrDefault().Title
每次都没有通过 Pages_L 表。
问题是:我可以用Entity Framework以某种方式做到这一点吗?我可以改变我项目中的每一项内容,所以每个建议都会很好! (从DB,到实体框架,到其他供应策略)。
答案 0 :(得分:0)
希望我没有误会你。
为什么不编写一个方法来返回您搜索的整个记录作为对象,然后从返回的对象返回到您想要的字段?该方法将返回一个Page类型的对象,但是使用Include stuff,您可以根据当前的限制返回一个与其相关的Pages_L实体的Page对象。然后你可以在你想要的部分到达它的任何一个领域。比如,让我们调用你的方法myQuery。
Page page = myQuery(language, pageID);
string ttl = page.Pages_L.Title;
这应该有效。如果没有,您可以使用lambda表达式来达到Title或简单地:
Page page = myQuery(language, pageID);
Pages_L pages_l = page.Pages_L;
tring ttl = pages_L.Title;
应该有用。
只需编写一个方法,将Page和Pages_L作为Page对象返回,并使用正确的LANGUAGE和ID参数。
public static Page (string lang, int pageID){
YourDBName dbContext = new YourDBName;
List<Page> pageList = ctx.Page.Include("Pages_L").Where(p=>p.ID == pageID);
Pages_L pages_l = new Pages_L();
foreach (Page page in pageList){
pages_l = page.Pages_L;
if(pages_l.Language == lang){
return page;
}}}
当然应该有更好的方法来进行此查询,使用foreach消除记录有点蹩脚,但我现在没有一个有用的数据库来测试这样的查询。此外,如果您确定至少有一条记录,则必须调用此函数。它就像“第一”但不像“FirstOrDefault”。但是,如果我没有误解你的问题,这应该有效。如果这有帮助,您可以使用多个“Where”和一些lambda表达式来提高查询的质量;而不使用List。
答案 1 :(得分:-1)
要在页面中使用不同的语言,您可以使用页面资源, 它不需要连接数据库的语言值。 你可以检查一下;
http://msdn.microsoft.com/en-us/library/ms227427.aspx http://msdn.microsoft.com/en-us/magazine/cc163566.aspx