我遇到一个奇怪的问题,一个EF实体生成一个不正确的查询,其中查询生成反映导航属性映射的列。但是,我删除了这些导航属性,查询仍然生成相关列。 有问题的实体如下......
[Table("Order")]
public partial class Order
{
public int OrderId { get; set; }
public int? OrderCampaignIDlink { get; set; }
public int? OrderItemIDlink { get; set; }
[Column(TypeName = "date")]
public DateTime? OrderDateAdded { get; set; }
public int? OrderStatusIDlink { get; set; }
public int? OrderSupplierIDlink { get; set; }
}
通过DbContext
...
public partial class Entities3 : DbContext
{
public Entities3() : base("name=Entities3")
{
Configuration.LazyLoadingEnabled = false;
}
public virtual DbSet<Order> Orders { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder){...}
}
有一个web api控制器调用“Orders”...
public async Task<IEnumerable<Order>> GetOrders()
{
return await Db.Orders.ToListAsync();
}
会抛出以下错误......
"Invalid column name 'Campaign_CampaignId'.\r\nInvalid column name 'Company_CompanyId'.\r\nInvalid column name 'OrderStatus_OrderStatusId'."
最后是SQL Server Profiler报告的生成查询...
SELECT
[Extent1].[OrderId] AS [OrderId],
[Extent1].[OrderCampaignIDlink] AS [OrderCampaignIDlink],
[Extent1].[OrderItemIDlink] AS [OrderItemIDlink],
[Extent1].[OrderDateAdded] AS [OrderDateAdded],
[Extent1].[OrderStatusIDlink] AS [OrderStatusIDlink],
[Extent1].[OrderSupplierIDlink] AS [OrderSupplierIDlink],
[Extent1].[Campaign_CampaignId] AS [Campaign_CampaignId],
[Extent1].[Company_CompanyId] AS [Company_CompanyId],
[Extent1].[OrderStatus_OrderStatusId] AS [OrderStatus_OrderStatusId]
FROM [dbo].[Order] AS [Extent1]
正如您所看到的,select
查询中有一些列根本没有映射。我以前有一些导航属性,如查询中所反映的,但我已将它们评论出来。
非常感谢任何帮助
答案 0 :(得分:0)
我想我会在这里留下答案以供将来参考。实际问题是相当简单和愚蠢的。我忘了删除关系另一边的Orders
引用。也就是说,我有一个Campaign
实体仍然保留对Order
实体的引用,如下所示......
public class Campaign
{
public Campaign()
{
Orders = new HashSet<Order>();
}
public virtual ICollection<Order> Orders {get;set; }
}
与具有Company
个实体集合的Order
实体相同。 EF期待Order
实体上的外键关系。删除(删除关系)或将相应的Campaign
和Company
导航属性与相应的外键添加到Order
实体(以反映正确的一对多关系) )应该摆脱错误。