【问题标题】:Eager Loading Many to Many relationship with an Association Entity - Entity Framework渴望加载与关联实体的多对多关系 - 实体框架
【发布时间】:2014-08-15 15:30:35
【问题描述】:

我与管理关联的其他实体有多对多关系。

实体如下:

public class WorkOrderItem : EntityBase
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long WorkOrderItemId { get; set; }

    public virtual ICollection<WorkOrderItemLanguage> WorkOrderItemLanguages { get; set; } 

}

 public class WorkOrderItemLanguage
{

    [Key, Column(Order = 0), DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long WorkOrderItemId { get; set; }
    [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.None)]
    public string LanguageId { get; set; }
    [Key, Column(Order = 2), DatabaseGenerated(DatabaseGeneratedOption.None)]
    public LanguageType LanguageType { get; set; }

    public virtual WorkOrderItem WorkOrderItem { get; set; }
    public virtual Language Language { get; set; }
}


public class Language : EntityBase
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public string LanguageId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Code { get; set; }
    public string IsoCode { get; set; }
    public int Ordinal { get; set; }

    public virtual ICollection<WorkOrderItemLanguage> WorkOrderItemLanguages { get; set; } 

}

模型构建器配置

public class WorkOrderItemConfiguration : EntityTypeConfiguration<WorkOrderItem>
{
    public WorkOrderItemConfiguration()
    {
        HasMany(x => x.WorkOrderItemLanguages).WithRequired(x => x.WorkOrderItem).HasForeignKey(x => x.WorkOrderItemId);
    }
}

public class LanguageConfiguration : EntityTypeConfiguration<Language>
{
    public LanguageConfiguration()
    {
        HasMany(x => x.WorkOrderItemLanguages).WithRequired(x => x.Language).HasForeignKey(x => x.LanguageId);
    }
}

如果生成查询以选择具有所有相关语言的 WorkOrderItem,我如何包含语言实体?

以下查询不加载语言实体

 UnitOfWork.Set<WorkOrderItem>()
            .Include(x => x.WorkOrderItemLanguages.Select(l=>l.Language))
            .FirstOrDefault(x.WorkOrderItemId == id);

【问题讨论】:

  • 没有加载Language实体的对象上LanguageId的值是多少?
  • 具体值?它来自另一个数据库 - 看起来像一个 GUID,但将它作为字符串存储在我的数据库中。这能回答你的问题吗?
  • 是否存在与字符串值匹配的LanguageId 语言?我也不建议将您的键设置为字符串。
  • 所有匹配项。我在下面使用 Ashish 的答案,它确实有效,但如果可能的话,我更喜欢强类型的解决方案。
  • 你能展示你的ModelBinder代码吗?

标签: c# .net entity-framework asp.net-4.5


【解决方案1】:

试试这个

var TesteEntities = UnitOfWork.Set<WorkOrderItem>()
        .Include("WorkOrderItemLanguages.Language")
        .FirstOrDefault(x.WorkOrderItemId == id);

你会在这里找到语言

【讨论】:

  • WorkOrderItemLanguage,WorkOrderItemLanguage.Language 是多余的,可以简化为WorkOrderItemLanguage.Language
  • “指定的包含路径无效。EntityType 'WorkOrderItem' 未声明名为 'WorkOrderItemLanguage' 的导航属性。”
  • 这确实有效,所以请点赞。如果可能,更喜欢强类型的解决方案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 2017-01-28
相关资源
最近更新 更多