C# entityframework核心-多对多-属性表达式无效

C# entityframework核心-多对多-属性表达式无效,c#,entity-framework,lambda,asp.net-core,ef-fluent-api,C#,Entity Framework,Lambda,Asp.net Core,Ef Fluent Api,应用程序版本: Asp.Net核心1.1 EF:Microsoft.EntityFrameworkCore(1.1.1) 行: _dbContext.MyTable1.Include(c=>c.mymediateTable)。然后Include(k=>k.Select(x=>x.MyTable2)).ToList() 例外情况: 属性表达式“k=>{from MyMediateTable x in k select” [x] .MyTable2}'无效。表达式应该表示一个 属性访问:“t=>t.

应用程序版本:

Asp.Net核心1.1

EF:Microsoft.EntityFrameworkCore(1.1.1)

行:

_dbContext.MyTable1.Include(c=>c.mymediateTable)。然后Include(k=>k.Select(x=>x.MyTable2)).ToList()

例外情况:

属性表达式“k=>{from MyMediateTable 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; }

}
[表格(“MyTable1”)]
公共类MyTable1
{
公共MyTable1()
{
MyIntermediateTable=新列表();
}
[列(“MyPK1”)]
公共int MyPK1{get;set;}
公共字符串名称{get;set;}
公共虚拟列表MyMediateTable{get;set;}
}
[表(“MyIntermediateTable”)]
公共类MyIntermediateTable
{
公共int MyPK1{get;set;}
公共int MyPK2{get;set;}
公共虚拟MyTable1 MyTable1{get;set;}
公共虚拟MyTable2 MyTable2{get;set;}
}
[表(“我的表2”)]
公共类MyTable2
{
公共MyTable2()
{
MyIntermediateTable=新列表();
}
[第二栏(“MyPK2”)]
公共int MyPK2{get;set;}
公共字符串名称{get;set;}
公共虚拟列表MyMediateTable{get;set;}
}
模型生成器(Fluent API)

modelBuilder.Entity((项)=>
{
HasKey(p=>new{p.MyPK1,p.MyPK2});
item.HasOne(u=>u.MyTable1)。带有多个(u=>u.mymediatetable)。HasForeignKey(u=>u.MyPK1);
item.HasOne(u=>u.MyTable2)。带有多个(u=>u.mymediatetable)。HasForeignKey(u=>u.MyPK2);
});
modelBuilder.Entity((项)=>
{
HasKey(p=>p.MyPK1);
item.HasMany(u=>u.MyIntermediateTable)。其中一个(u=>u.MyTable1)。HasForeignKey(u=>u.MyPK1);
});
modelBuilder.Entity((项)=>
{
HasKey(p=>p.MyPK2);
item.HasMany(u=>u.MyIntermediateTable)。其中一个(u=>u.MyTable2)。HasForeignKey(u=>u.MyPK2);
});

在进行自动竞赛时,Visual Studio中的Intellisense将仅显示列表属性

这是一个bug(或Intellisense在编写本文时无法处理的东西),当有两个重载与签名匹配时就会发生:一个用于
t
,另一个用于
IEnumerable

出现这种情况时,只需键入
。然后输入include(m=>m.MyProperty)
,即使intellisense不会向您显示
MyProperty
,忽略IDE显示的任何错误

关闭方法括号后,错误将消失

额外信息
此漏洞由dotnet roslyn GitHub存储库上的GitHub问题跟踪。

@SamiKuhmonen事实上,它是这样的。示例:@GertArnold如果我是一对一的话,那就行了relationship@GertArnold“first”include是一个列表,所以第二个include不能是“thenclude”,一旦尝试使用lambda表达式,就会出现“lists options”。请尝试编写代码,这样你会理解得更好。(使用asp net core,否则,是的,这是可能的)如果您指的是Intellisense将只显示列表属性,那么当有两个重载与签名匹配,但一个用于T,另一个用于T的列表时,就会发生错误。然后键入
。然后包括(m=>m.MyProperty)
即使intellisense不会向您显示MyProperty。一旦关闭该方法,错误将消失。智能感知在这种情况下感到困惑,并选择了错误的智能感知。我一直在这样做<代码>包含(c=>c.MyIntermediateTable)。然后包含(k=>k.MyTable2))。
       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);
        });