MVC3 EF4.1 代码优先延迟加载
Posted
技术标签:
【中文标题】MVC3 EF4.1 代码优先延迟加载【英文标题】:MVC3 EF4.1 Code-First Lazy Loading 【发布时间】:2011-08-29 18:06:57 【问题描述】:我有这种情况:
MVC3 应用,带有 EF4.1 Code-First 和 SQLCE。
实体:
内容; 翻译;对于每个 内容 项目,将有 N 个由 GUID 链接的翻译。所以 Content 类对 Translation 没有任何引用,但每个翻译都有一个 Content 属性。
Content 类有一个 NotMapped Translation 只是为了将单个模型发送到视图。
当我填充数据库时,我可以使用 GUID 作为参数成功填充两个表。
但是如何从视图中加载翻译?我对延迟加载、导航属性等这些东西很陌生。
恢复,我可以正确填充,但不知道如何在单个视图中加载两者。如何根据“语言环境”参数加载翻译。
谁能帮我解决这个问题?
谢谢。
更新:代码
内容类
public class Content
#region [ Properties ]
/// <summary>
/// The GUID
/// </summary>
[Key]
public string GUID get; set;
public string Type get; set;
[NotMapped]
public Translation Translation get; set;
#endregion
翻译类
public class Translation
[Key]
public int ID get; set;
public Content Content get; set;
public string Name get; set;
public string Description get; set;
人口代码
for (int i = start; i < (start + 2); i++)
Content c = new Content(1234);
c.Type = Type.ToString();
using (ContentContext db = new ContentContext())
if (!db.Contents.Any(o => o.GUID == c.GUID))
c.PopulateInfo(Locale);
db.Contents.Add(c);
c.RegionalInfo.Name = "test";
db.Translations.Add(c.Translation);
db.SaveChanges();
else
c = db.Contents.Single(o => o.GUID == c.GUID);
// local list to load on the controller
Contents.Add(c);
【问题讨论】:
您能否给我们一些代码(您的加载和数据传递)。这样推理更容易。我会在将内容传递给视图之前急切地加载内容,但这可能取决于您的代码 【参考方案1】:你做不到。如果您想要延迟加载,您必须在您的内容上公开翻译。如果您只想在内容上拥有一个非映射翻译,则必须在将内容传递给视图之前手动加载(单独查询):
Content content = LoadContent();
content.Translation = context.Translations
.Single(t => t.Content.GUID == contentId && t.Name == locale);
【讨论】:
【参考方案2】:首先,我认为您的内容实体应该有一个翻译的 ICollection 以正确表示翻译和内容之间的 1:N 关系。 其次,如果您想在一个查询中检索正确的翻译和内容,请从翻译开始,如下所示:
var translation = context.Translations.Include("Content").Single(t => t.Content.GUID == contentId && t.Name == locale);
【讨论】:
以上是关于MVC3 EF4.1 代码优先延迟加载的主要内容,如果未能解决你的问题,请参考以下文章
MVC3 代码优先 - EF4.1 不会自动创建表(使用 MySQL 和 Connector/Net 6.3.6。)
如何使用 MVC3 多对多关系和 EF4.1 模型优先检索数据?