这是我第一次使用Entity Framework4.3.1在C#中创建项目。我在从锦标赛表格中获取所有数据时遇到了麻烦,准确地说是地址。
首先,这是我的code First代码。当我运行这段代码时,这两个表被正确地创建并具有正确的关系。我在这些类中定义了更多的列,但在本例中我只显示了几个列。
public class EFDbContext : DbContext
{
public EFDbContext()
: base("ApplicationServices")
{
}
public DbSet<Tournament> tournaments { get; set; }
public DbSet<Address> addresses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
public class Tournament
{
[ScaffoldColumn(false)]
public int TournamentId { get; set; }
[Required(ErrorMessage="Tournament name is a required field")]
public string Name { get; set; }
[Required(ErrorMessage="Address is a required field")]
public Address Address { get; set; }
}
public class Address
{
[ScaffoldColumn(false)]
public int AddressId { get; set; }
[Required(ErrorMessage="Street name is a required field")]
public string Street { get; set; }
[Required(ErrorMessage="House number is a required field")]
public string HouseNo { get; set; }
}
}
当我插入一个带有地址的新锦标赛时,我去数据库中检查是否使用了该关系,我可以看到它起作用了。锦标赛有一个指向新插入地址的Address_AddressId值。但是当我尝试通过这样做来获取信息时:
Tournament tournament = context.tournaments.Find(id);
我对它进行了调试,我可以看到除了地址之外,所有来自锦标赛的数据都在锦标赛对象中。这被设置为null,我完全不知道为什么。
你们能帮帮我吗?
先谢谢你,巴特
发布于 2012-04-29 15:01:22
您需要熟悉一下如何使用实体框架加载相关数据。这里有一个介绍:http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx,这些都是你需要知道的基础知识,才能有效地使用实体框架。
您所看到的行为是意料之中的。实体框架不会在您只加载父实体Tournament
(在您的示例中使用Find
)时自动加载导航属性,如Tournament.Address
。
加载相关数据基本上有三种选择:
锦标赛= context.tournaments .Include(t => t.Address) // <-“急切加载”.SingleOrDefault(t => t.TournamentId == id);
我们将在单个往返和数据库查询中加载锦标赛和地址。
virtual
:公共虚拟地址{ get;set;}
EF将在您加载锦标赛时动态创建一个代理对象(从Tournament
派生),该对象能够在您访问其属性之一时立即加载相关实体:
锦标赛= context.tournaments.Find(id);字符串街= tournament.Address.Street;//第二次查询DB发生here
锦标赛= context.tournaments.Find(id);context.Entry(锦标赛).Reference(t => t.Address).Load();//这里发生了对DB的第二次查询
这类似于延迟加载,因为您还需要对数据库进行两次查询和往返,但您可以显式控制何时加载Address
。显式加载具有筛选或排序相关数据(在导航集合的情况下)的选项,这是其他两个选项所不具备的。
https://stackoverflow.com/questions/10367201
复制相似问题