【问题标题】:MVC3 EF4.1 Code-First Lazy LoadingMVC3 EF4.1 代码优先延迟加载
【发布时间】: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);
        }

【问题讨论】:

  • 您能否给我们一些代码(您的加载和数据传递)。这样推理更容易。我会在将内容传递给视图之前急切地加载内容,但这可能取决于您的代码

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


【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 2011-05-03
      • 1970-01-01
      相关资源
      最近更新 更多