最初の簡単な背景: Entity Framework v1 を使用する既存の ASP.NET MVC 1 アプリケーションはかなりうまく機能しますが、40 個のテーブルに到達するため、.edmx は扱いにくくなり、Visual Studio 2008 デザイナーで破損する傾向があります。私がやりたいことは、DAL を移行して EF4 と Code-First を使用できるかどうかを確認することです。
最初は、単純な親子関係をモデル化しようとしていますが、あまり進んでいません。次の POCO クラスに対応する2 つのテーブルがClient
あります。Address
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)
およびのデフォルトAddress
オブジェクトを返すことを除けば、期待どおりにデータベースから 10 個の結果を返します。Client.WorkAddress
Client.HomeAddress
私の推測ではObjectContext.ContextOptions.LazyLoadingEnabled = true
、間違った場所に設定しているか、(より可能性が高い) と の間の関係Client
をAddress
正しく取得していません。