实体框架查询映射问题

时间:2015-04-18 11:04:47

标签: sql-server asp.net-mvc entity-framework asp.net-web-api

我遇到一个奇怪的问题,一个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查询中有一些列根本没有映射。我以前有一些导航属性,如查询中所反映的,但我已将它们评论出来。

我尝试过的事情

  • 刷新互联网浏览器(Ctrl + F5)
  • 停止,重新启动IIS中的AppPool

非常感谢任何帮助

1 个答案:

答案 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实体上的外键关系。删除(删除关系)或将相应的CampaignCompany导航属性与相应的外键添加到Order实体(以反映正确的一对多关系) )应该摆脱错误。