【问题标题】:entityframework core - many to many - The property expression is not validentityframework core - 多对多 - 属性表达式无效
【发布时间】:2017-03-23 20:13:40
【问题描述】:

应用版本:

Asp 网络核心 1.1

EF:Microsoft.EntityFrameworkCore (1.1.1)

行:

_dbContext.MyTable1.Include(c => c.MyIntermediateTable).ThenInclude(k => k.Select(x => x.MyTable2)).ToList();

例外:

属性表达式 'k => {from MyIntermediateTable x in k select [x].MyTable2}' 无效。表达式应该代表一个 属性访问:'t => t.MyProperty'。有关更多信息 包括相关数据

我的实体

[Table("MyTable1")]
public class MyTable1
{
    public MyTable1()
    {
        MyIntermediateTable = new List<MyIntermediateTable>();
    }

    [Column("MyPK1")]
    public  int MyPK1 { get; set; }
    public  string Name{ get; set; } 

    public virtual List<MyIntermediateTable> MyIntermediateTable{ get; set; }
}

[Table("MyIntermediateTable")]
public class MyIntermediateTable
{

    public int MyPK1 { get; set; }
    public int MyPK2 { get; set; }
    public virtual MyTable1 MyTable1 { get; set; }
    public virtual MyTable2 MyTable2 { get; set; }
 }

[Table("MyTable2")]
public class MyTable2
{
    public MyTable2()
    {
         MyIntermediateTable = new List<MyIntermediateTable>();
    }

    [Column("MyPK2")]
    public int MyPK2 { get; set; }
    public  string Name{ get; set; } 

    public virtual List<MyIntermediateTable> MyIntermediateTable{ get; set; }

}

模型生成器(Fluent API)

       modelBuilder.Entity<MyIntermediateTable>((item) =>
        {
            item.HasKey(p => new { p.MyPK1, p.MyPK2 });
            item.HasOne(u => u.MyTable1).WithMany(u => u.MyIntermediateTable).HasForeignKey(u => u.MyPK1);
            item.HasOne(u => u.MyTable2).WithMany(u => u.MyIntermediateTable).HasForeignKey(u => u.MyPK2);
        });

        modelBuilder.Entity<MyTable1>((item) =>
        {
            item.HasKey(p => p.MyPK1);
            item.HasMany(u => u.MyIntermediateTable).WithOne(u => u.MyTable1).HasForeignKey(u => u.MyPK1);
        });

        modelBuilder.Entity<MyTable2>((item) =>
        {
            item.HasKey(p => p.MyPK2);
            item.HasMany(u => u.MyIntermediateTable).WithOne(u => u.MyTable2).HasForeignKey(u => u.MyPK2);
        });

【问题讨论】:

  • @SamiKuhmonen 实际上,确实如此。示例:stackoverflow.com/questions/3356541/…
  • @GertArnold 如果我有一对一的关系,它会起作用
  • @GertArnold “第一个”包含是一个列表,所以第二个包含不能是一个“thenInclude”,一旦你尝试使用 lambda 表达式,它就会出现“列表选项”。请尝试编写代码,您会更好地理解。 (使用asp net core,否则是可以的)
  • 如果您指的是 Intellisense 只会向您显示列表属性,那么这是一个错误,当有两个重载与签名匹配但一个用于 T 另一个用于 T 列表时,就会发生这种情况。然后就输入.ThenInclude(m =&gt; m.MyProperty),即使智能感知不会显示MyProperty。关闭该方法后,错误将消失。 Intellisense 在这种情况下感到困惑并选择了错误的
  • 我一直这样做。 Include(c =&gt; c.MyIntermediateTable).ThenInclude(k =&gt; k.MyTable2)).

标签: c# entity-framework lambda asp.net-core ef-fluent-api


【解决方案1】:

Visual Studio 中的 Intellisense 只会在进行自动竞争时向您显示列表属性。

这是一个错误(或在撰写本文时 Intellisense 无法处理的问题),当有两个与签名匹配的重载时会发生这种情况:一个用于T,另一个用于IEnumerable&lt;T&gt;

当这种情况出现时,即使智能感知不会显示MyProperty,也只需输入.ThenInclude(m =&gt; m.MyProperty),忽略IDE 显示的任何错误。

关闭方法括号后,错误就会消失。

额外信息

此错误由 dotnet roslyn GitHub 存储库上的此 GitHub 问题 Completion missing members of lambda parameter in fault tolerance case 跟踪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多