我尝试与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"));
}
数据库表:
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:
我尝试了不同的映射选项,例如:HasOptional,WithRequiredPrincipal,尝试将Customer proeprty添加到City(虽然它不正确,City不必了解客户的某些内容) 什么都没有帮助。相关实体始终为空。 我哪里错了?
答案 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。