Сначала краткий обзор: у меня есть существующее приложение ASP.NET MVC 1, использующее Entity Framework v1, которое работает довольно хорошо, хотя из-за того, что имеется 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
и Client.HomeAddress
.
Я предполагаю, что либо я устанавливаю ObjectContext.ContextOptions.LazyLoadingEnabled = true
в неправильном месте, либо (что более вероятно), я не получаю правильные отношения между Client
и Address
.