我正在尝试用.net核心编写我的第一个web api。我使用VS2017和核心1.1。除了我的一个对象之外,我已经完成了所有工作(我已经尝试了最后一行评论和取消注释......它没有任何区别):
public class Tag
{
public int ID { get; set; }
public string Name { get; set; }
public bool ShowInFilter { get; set; }
public ICollection<SubscriberTag> SubscriberTags { get; set; }
}
我的存储库代码如下所示:
private SubscriptionContext db;
public TagRepository(SubscriptionContext context) { db = context; }
public Tag Find(int key) => db.Tags.SingleOrDefault(a => a.ID == key);
这是从我的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; }
}
订阅者类(删除了大量不相关的属性):
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; }
}
答案 0 :(得分:1)
由于订阅者上的属性Tags
:
public ICollection<Subscribers.Models.Tag> Tags { get; set; }
实体框架期望Tag对象具有Subscriber的外键,因此它使用它构建查询。看起来要配置多对多关系需要将属性更改为:
public ICollection<Subscribers.Models.SubscriberTag> SubscriberTag{ get; set; }
Configuring a Many-to-Many Relationship。
感谢伊万的见解