2013-12-06 1 views
1

Я довольно новичок в Entity Framework, и, хотя у него много преимуществ перед NHibernate, я разочарован тем, что обнаружил, что он не поддерживает ленивую загрузку свойств.Могу ли я ленить загружать часть объекта в Entity Framework 6 с разделением объектов?

Возьмите этот класс:

public class Product 
{ 
    public virtual Guid Id {get;set;} 
    public virtual string Name {get;set;} 
    public virtual string Details {get;set;} 
} 

Мой план состоял в том, чтобы использовать Entity Нарезка для отображения его на две таблицы:

CREATE TABLE [dbo].[Product](
[Id] [uniqueidentifier] NOT NULL PRIMARY KEY, 
[Name] [nvarchar](50) NULL 
) 

CREATE TABLE [dbo].[ProductDetails](
[Id] [uniqueidentifier] NOT NULL PRIMARY KEY, 
[Details] [nvarchar](max) NULL 
) 

И вот мой беглый отображение:

modelBuilder.Entity<Product>() 
      .Map(m => 
      { 
       m.Properties(t => new { t.Id, t.Name }); 
       m.ToTable("Product"); 
      }) 
      .Map(m => 
      { 
       m.Properties(t => new { t.Id, t.Details}); 
       m.ToTable("ProductDetails"); 
      }); 

Я хочу показать список продуктов, не загружая поле сведений. Однако, когда я загружаю продукт, он всегда делает INNER JOIN. Я хочу, чтобы он читал только из Product, но затем читал из ProductDetails, когда я читал свойство Details.

Как это можно достичь?

Если это невозможно, как еще я могу реализовать ленивую загрузку свойств?

Разделение таблицы неприемлемо, так как это означает, что механизм персистенции диктует дизайн домена.

Редактировать после ответа CodeCaster в:

Домен фиксирована - Я не хочу решение, которое вводит объект Детали изделия. Этот вопрос касается сохранения существующей модели домена. Изменение домена не отвечает на вопрос.

ответ

3

Как можно выполнить скалярные свойства ленивой загрузки из разделенных таблиц?

Если это невозможно, как еще я могу реализовать ленивую загрузку свойств?

Вы can't, ленив-только работает только для navigation properties.

Если изменить вашу модель, как это:

public class Product 
{ 
    public virtual Guid Id {get;set;} 
    public virtual string Name {get;set;} 

    public virtual ProductDetails Details {get;set;} 
} 

public class ProductDetails 
{ 
    public virtual Guid Product_Id {get;set;} 
    public virtual string Details {get;set;} 
} 

Вы можете использовать отложенную загрузку, где ProductDetails будет запрошен только тогда, когда вы получаете Product.Details собственности.

[Будет] это означает, что механизм персистентности диктует дизайн домена?

Модели сущностей не обязательно должны быть доменными моделями.

+0

может быть, я не ясно , но это именно то, чего я пытался избежать. Вы говорите, что модели Entity не обязательно должны быть моделями доменов. Я начинаю думать, что это означает, что EF не подходит для неуверенной модели домена? –

+0

_ «EF не подходит для неустойчивой модели домена?» - EF - это ORM, который в значительной степени привязан к базам данных SQL, который вряд ли можно считать неустойчивым. :) – CodeCaster

+0

Хорошо спроектированный домен не знает даже O/RM или даже наличие O/RM. Я могу вообще заменить NHibernate или EF в своих системах или, возможно, даже на базу данных документов (хотя я еще этого не пробовал). –

0

Вы можете использовать следующий класс, я использую в моем проекте:

/// <summary> 
/// Wrapper class for an unlimited size string property 
/// to allow for lazy loading with Entity Framework. 
/// </summary> 
public class Text 
{ 
    [MaxLength] 
    public string Value { get; set; } 

    public static implicit operator string(Text val) 
    { 
     return val.Value; 
    } 

    public static implicit operator Text(string val) 
    { 
     return new Text { Value = val }; 
    } 

    public override string ToString() 
    { 
     return Value; 
    } 
} 

Поскольку класс переопределяет неявный оператор, вы можете обращаться объектом типа Text так же, как нормальная строка:

Text myText = "Hello Text"; 

В классе сущностей вы можете просто создать (Загрузка отложенной) свойство виртуального:

public virtual Text Comment { get; set; } 
Смежные вопросы