C# EntityFrameworkCore在查询中使用了错误的列

C# EntityFrameworkCore在查询中使用了错误的列,c#,entity-framework-core,C#,Entity Framework Core,我正试图用.net内核编写我的第一个web api。我正在使用VS2017和core 1.1。除了我的一个对象之外,我的一切都正常工作(我用最后一行注释和未注释的内容试过了……没什么区别): 正在从我的TagController调用的: private iTagRepository TagItems { get; set; } public TagController(iTagRepository tagItems) {TagItems = tagItems; } [HttpGet("{id}

我正试图用.net内核编写我的第一个web api。我正在使用VS2017和core 1.1。除了我的一个对象之外,我的一切都正常工作(我用最后一行注释和未注释的内容试过了……没什么区别):

正在从我的TagController调用的:

private iTagRepository TagItems { get; set; }
public TagController(iTagRepository tagItems) {TagItems = tagItems; }

[HttpGet("{id}", Name = "GetTag")]
public IActionResult Get(int id) { return new ObjectResult( TagItems.Find(id) ); }
问题是,当我运行它时,执行的查询是:

exec sp_executesql 
N'SELECT TOP(2) [a].[ID], [a].[Name], 
    [a].[ShowInFilter], [a].[SubscriberID]
FROM [Tags] AS [a]
WHERE [a].[ID] = @__key_0',N'@__key_0 int',@__key_0=1
因为标记不包含名为SubscriberID的列,所以会引发错误。 我搜索了所有代码,SubscriberID只显示了两个位置(在这里不使用的其他类中)。我在整个项目中没有部分课程(这是一个相关问题的问题)

为什么EF要将此列添加到其查询中?如何修复它

根据请求,这里是包含subscriberID的类:

public class SubscriberTag
{
    public long ID { get; set; }
    public long subscriberID { get; set; }
    public int tagID { get; set; }

    public Subscriber Subscriber { get; set; }
    public Tag Tag { get; set; }
}
订户类(删除了大量不相关的属性):

公共类订户
{
公共用户()
{
//一些值初始化器/默认值
}
公共长ID{get;set;}
[长度(200)]
公共字符串名{get;set;}
//.......
公共ICollection订阅{get;set;}
公共ICollection标记{get;set;}
}

由于订阅服务器上的属性
标签

public ICollection<Subscribers.Models.Tag> Tags { get; set; }
公共ICollection标记{get;set;}
实体框架希望标记对象对订阅者有一个外键,以便使用它构建一个查询。似乎需要配置多对多关系以将属性更改为:

public ICollection<Subscribers.Models.SubscriberTag> SubscriberTag{ get; set; }
公共ICollection SubscriberTag{get;set;}


感谢Ivan提供的见解,我不确定,但我会看看创建数据库的迁移。看起来EF无法确定哪个类是标记订阅关系中的主体,并将SubscriberID作为外键添加到标记中。我们可以看到SubscriberID是的主键吗?是否有另一个继承
标记的实体类
?换句话说,如果将定义更改为
公共密封类标记
,会发生什么情况?@IvanStoev No。。。将sealed添加到定义中没有任何效果。@DanielBoyer我们可以同时看到
订户
类吗?如果
Subscriber
有一个属性:
公共列表标记{get;set;}
,它将解释EF的外键期望值。。。但这并不是你没有得到上下文不匹配错误的原因。但是修复方法应该只是将
public-ICollection-Tags{get;set;}
更改为
public-ICollection-SubscriberTags{get;set;}
,就像它在
Tag
类中一样,因为它看起来是一种
多对多
关系。@IvanStoev这样做的(你是对的,这是多对多的)@IvanStoev。我现在看到了。OP在代码中创建了自己的多对多联接表,而不是让EF处理。很好,我看到的是类属性,而不是更大范围的命名约定。@JaredStroeb实际上自己的联接表是EF Core中唯一的选项:)@IvanStoev Ah再次感谢。我没有机会使用EF core。我期待着在接下来的几个月里转到core。
public class Subscriber
{
    public Subscriber()
    {
        //a few value initalizers/defaults
    }

    public long ID { get; set; }
    [StringLength(200)]
    public string FirstName { get; set; }
    //.......

    public ICollection<Subscribers.Models.Subscription> Subscriptions { get; set; }
    public ICollection<Subscribers.Models.Tag> Tags { get; set; }
}
public ICollection<Subscribers.Models.Tag> Tags { get; set; }
public ICollection<Subscribers.Models.SubscriberTag> SubscriberTag{ get; set; }