EF 4.0 - отображение только для чтения с частным полем - PullRequest
12 голосов
/ 26 августа 2010

Можно ли отобразить следующий класс POCO с EF 4.0?

public class MyClass
{
  private string _myData;

  public MyClass() 
  { }

  public MyClass(string myData)
  {
    _myData = myData;
  }

  public string MyData
  {
    get
    {
      return _myData;
    }
  }
}

В NHibernate я думаю, что это возможно, когда я использую атрибут доступа в отображении, как:

<class name="MyClass" table="MyTable">
  <property name="MyData" access="field.camelcase-underscore" column="MyCol" type="string" length="50" />
</class>

Интересно, есть ли какой-нибудь эквивалент доступа в EF 4.0? В настоящее время я могу отобразить класс, только если я добавлю защищенный установщик в свойство MyData:

  public string MyData
  {
    get
    {
      return _myData;
    }
    protected set
    {
      _myData = value;
    }
  }

Это работает, но для устаревших классов это означает обновление всех свойств, которые не имеют установщика.

Изменить:

Я обновил последний пример кода, потому что он также не работает с приватным сеттером. Сеттер должен быть как минимум защищен. Если сеттер является частным или не существует, выдается следующее исключение:

System.InvalidOperationException: Карта и метаданные могут не найден для EntityType 'MyNamespace.MyClass'.

Ответы [ 2 ]

6 голосов
/ 04 апреля 2012

Это для объектов Code First POCO, чтобы помочь Шимми и другим, интересующимся, как все это работает с Code First

Я думаю, что вы, возможно, просто не понимаете, как работает Entity Framework,Мне тоже потребовалось некоторое время, чтобы понять.

Entity Framework работает путем создания подклассов ваших объектов POCO с помощью прокси-класса, который используется для сериализации и десериализации ваших объектов.Это означает, что если у вас есть закрытый метод или свойство set (или все вместе отсутствует), то у подклассового метода не будет возможности установить свойство.Установщики и свойства, которые вы хотите использовать в Entity Framework, ДОЛЖНЫ быть либо защищенными, либо общедоступными.

Если вы хотите, чтобы ваши сложные свойства загружались лениво, вы также должны сделать их виртуальными, чтобы Entity Framework мог использовать их какЧто ж.Если вы хотите загружать их, вы должны использовать метод Include.

Чтобы полностью ответить на ваш вопрос, да, вы должны пойти и добавить свойства сеттера ко всем вашим свойствам, которые вы хотите EntityРамки для вас.Нет, Entity Framework не предоставляет способ сопоставления свойств, которые не имеют установщика.

NHibernate работает немного по-другому, поскольку он переопределяет все ваши свойства, и я считаю, что он используетзакрытые переменные в подклассах, которые он генерирует, устанавливают закрытые переменные, а переопределенные свойства возвращают закрытые переменные.AKA, NHibernate не нуждается в установщике самого свойства, тогда как Entity Framework фактически устанавливает свойство.Преимущество Entity Framework в этом состоит в том, что он возвращает фактический созданный вами объект POCO, а не подклассный объект, такой как NHibernate.Единственный раз, когда вы получаете подклассный объект, это когда вы используете лениво загруженные сложные свойства, когда Entity Framework возвращает прокси-подкласс.Когда вы на самом деле извлекаете данные, прокси-сервер снова устанавливает свой класс POCO.

Ваш установщик должен быть общедоступным или защищенным, как у вас в вопросе:

public class MyClass
{
    private string _myData;

    public MyClass() { }

    public MyClass(string myData)
    {
        // In case there is specialized logic, you should call the property setter here
        // unless the property is a virtual property. You should never call any virtual
        // methods or properties in your constructor.
        MyData = myData;
    }

    public string MyData
    {
        get
        {
            return _myData;
        }
        protected set
        {
            _myData = value;
        }
    }
}
5 голосов
/ 22 января 2011

Я играл с этим немного, и мой вывод:

  • Я не могу отобразить устаревшие типы, у которых вообще нет сеттера.
  • Я могу отображать типы, которые имеют частный установщик, но я также должен установить доступность сеттера в EDMX. Недостаточно определить сеттер в классе POCO - EDMX должен знать об этом.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...