首先是一些简短的背景:我有一个使用 Entity Framework v1 的现有 ASP.NET MVC 1 应用程序,它工作得相当好,但因为有 40 个表,所以 .edmx 变得笨拙并且容易与 Visual Studio 2008 设计器一起损坏。我想做的是看看迁移 DAL 以使用 EF4 和 Code-First 是否可行。
最初,我试图模拟简单的父/子关系,但没有走得太远。我有 2 个表Client
,Address
它们对应于以下 POCO 类:
public class Client
{
public int ClientId { get; set; }
public string Name { get; set; }
public Address HomeAddress { get; set; }
public Address WorkAddress { get; set; }
// More properties here
}
public class Address
{
public int AddressId { get; set; }
public string NameOrNumber { get; set; }
public string Line1 { get; set; }
// More properties here
}
此外,我有一个DbContext
类,我在其中使用流利的 api 定义关系:
public class AppContext : DbContext
{
public SlobContext() : base()
{
this.ObjectContext.ContextOptions.LazyLoadingEnabled = true;
}
public DbSet<Client> Clients
{
get;
set;
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Address>().MapSingleType().ToTable("Address");
modelBuilder.Entity<Client>().HasKey(c => c.ClientID);
modelBuilder.Entity<Client>().HasRequired<Address>(c => c.HomeAddress);
modelBuilder.Entity<Client>().HasRequired<Address>(c => c.WorkAddress);
modelBuilder.Entity<Client>()
.MapSingleType(c => new
{
Name = c.Name,
ClientID = c.ClientID,
HomeAddressID = c.HomeAddress.AddressID,
WorkAddressID = c.WorkAddress.AddressID
})
.ToTable("Client");
}
}
因此,在我的控制器中,我可以将以下内容作为模型返回:
Context.Clients.Take(10).OrderBy(i => i.Name)
它按预期从数据库返回 10 个结果,除此之外它返回一个默认Address
对象Client.WorkAddress
and Client.HomeAddress
。
我的猜测是,要么我设置ObjectContext.ContextOptions.LazyLoadingEnabled = true
在错误的位置,要么(更有可能)我没有得到Client
正确Address
的关系。