2013-10-10 2 views
7

Я хотел бы сохранить некоторые работы, избегая наличия двух наборов объектов в моем коде. На данный момент у меня есть первый набор, который представляет собой всего лишь кучу суррогатных суррогатных объектов для EF со стандартными конструкторами и настраиваемыми свойствами, чтобы он мог отображать их. Другой - это набор реальных объектов, которые я использую в своем бизнес-коде. Настоящие неизменяемы и полностью инициализируются во время создания с помощью инициализационных конструкторов.Есть ли способ сопоставления с неизменяемыми объектами в структуре сущностей?

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

ответ

6

Невозможно, EF требует конструктора без параметров и он должен иметь возможность устанавливать свойства.

Для лучшего инкапсулирования вы можете сделать сеттеры protected. EF по-прежнему сможет устанавливать значения свойств (через сгенерированный прокси), но с внешней точки зрения он будет выглядеть неизменным.

3

Не могу добавить комментарий, так что. Теперь это возможно, потому что EF теперь может отображать частные свойства. И в 6.1.3 делает это по умолчанию (не уверен в предыдущих выпусках). Пример ниже.

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var context = new MyContext()) 
     { 
      context.MyImmutableClassObjects.Add(new MyImmutableClass(10)); 
      context.MyImmutableClassObjects.Add(new MyImmutableClass(20)); 
      context.SaveChanges(); 
      var myImmutableClassObjects = context.MyImmutableClassObjects.ToList(); 
      foreach (var item in myImmutableClassObjects) 
      { 
       Console.WriteLine(item.MyImmutableProperty); 
      } 
     } 

     Console.ReadKey(); 
    } 
} 

public class MyContext : DbContext 
{ 
    public DbSet<MyImmutableClass> MyImmutableClassObjects { get; set; } 
} 

public class MyImmutableClass 
{ 
    [Key] 
    public int Key { get; private set; } 

    public int MyImmutableProperty { get; private set; } 

    private MyImmutableClass() 
    { 

    } 

    public MyImmutableClass(int myImmutableProperty) 
    { 
     MyImmutableProperty = myImmutableProperty; 
    } 
} 
Смежные вопросы