EF 6.0 Fluent Api中的空白实体

时间:2014-12-13 17:56:14

标签: sql entity-framework mapping one-to-one fluent

我尝试与Entity Framework 6实现1..0关系。我使用实例关联。我尝试从网络和论坛重复这些例子,但不知怎的,它对我不起作用。请帮忙。

实体:

  public class CustomerWithFk : Item  // Item contains Id
    {
        public string Name { get; protected set; }
        public virtual City City { get; set; }      // relation property. Can be 1 or 0
        public virtual Product Product { get; set; }
        public decimal Money { get; protected set; }
    }

    public class City : Item
    {
        public string Name { get; protected set; }
    }

映射:

public CityMap()
{
    ToTable("Cities");
    HasKey(c => c.Id);
}

public CustomerFkAssosiationMap()
{
    ToTable("Customers");
    HasKey(c => c.Id);

    HasRequired(g => g.City)
        .WithRequiredDependent();

    HasRequired(g => g.Product)
                .WithRequiredDependent()
                .Map(x => x.MapKey("ProductId"));
}

数据库表: enter image description here

SQL Profiler为我提供了enxt SQL请求:

SELECT 
    1 AS [C1], 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[Money] AS [Money], 
    [Extent1].[CityId] AS [CityId], 
    [Extent1].[ProductId] AS [ProductId]
    FROM [dbo].[Customers] AS [Extent1]

因此,我没有看到任何加入来从城市或产品加载数据。 结果是Null: enter image description here

我尝试了不同的映射选项,例如:HasOptional,WithRequiredPrincipal,尝试将Customer proeprty添加到City(虽然它不正确,City不必了解客户的某些内容) 什么都没有帮助。相关实体始终为空。 我哪里错了?

1 个答案:

答案 0 :(得分:1)

问题是您没有包含相关对象。使用Include尝试这样的事情:

var list = context.CustomerWithFk
                  .Include("City")
                  .Include("Product");

告诉实体框架您希望将客户与城市和产品一起撤回。如果您有兴趣,请进一步阅读:http://msdn.microsoft.com/en-us/data/jj574232.aspx

编辑:您还可以通过将此添加到您的上下文中来启用延迟加载(根据您的评论,我相信这是您所追求的):

context.ContextOptions.LazyLoadingEnabled = true;

在此处阅读有关延迟加载的详情:http://msdn.microsoft.com/en-us/library/vstudio/dd456846(v=vs.100).aspx