MVC3 EF4.1代码优先延迟加载

时间:2011-08-29 18:06:57

标签: c# asp.net-mvc-3 entity-framework-4.1

我遇到这种情况:

MVC3应用程序,使用EF4.1 Code-First和SQLCE。

实体:

  • 内容;
  • 翻译;

对于每个内容项目,将有GUID链接的 N 翻译。因此,Content类没有对翻译进行任何参考,但每个翻译都有内容属性。

Content类具有NotMapped Translation,只是为了向视图发送单个模型。

当我填充数据库时,我可以使用GUID作为参数成功填充两个表。

但我如何从视图中加载翻译?我是懒惰加载,导航属性等新东西。

恢复,我可以正确填充,但没有弄清楚如何在一个视图中加载它们。如何基于“locale”参数加载翻译。

有人可以帮我吗?

感谢。

更新:代码

内容类

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);
        }

2 个答案:

答案 0 :(得分:1)

你不能这样做。如果您想延迟加载,则必须在内容上公开翻译。如果您希望在内容上只有一个非映射翻译,则必须先手动加载它(单独查询),然后才能将内容传递给视图:

Content content = LoadContent();
content.Translation = context.Translations
                              .Single(t => t.Content.GUID == contentId && t.Name == locale);

答案 1 :(得分:1)

首先,我认为您的内容实体应该有一个ICollection of Translation来正确表示翻译和内容之间的1:N关系。 其次,如果你想在一个查询中检索正确的翻译和内容,请从翻译开始,如下所示:

var translation = context.Translations.Include("Content").Single(t => t.Content.GUID == contentId && t.Name == locale);
相关问题