Сопоставить производный тип с той же таблицей в EF - PullRequest
1 голос
/ 21 октября 2011

Следующий простой пример кода иллюстрирует рассматриваемый сценарий.У меня есть сущность Person, которая просто отображается в таблицу Person в БД.Я использую генератор кода Entity Object по умолчанию.

public partial class Person { ... }

У меня есть класс PersonDetail, унаследованный от Person, который содержит некоторые дополнительные свойства, необходимые для графического интерфейса.Ни одно из этих свойств не должно сохраняться в БД, поэтому я не хочу отображать этот класс в базу данных.

public class PersonDetail : Person
{
    public int TheGuiNeedsThisInformation { get; set; }
}

И я отправляю экземпляры класса Detail с графическим интерфейсом WCF.Моя проблема заключается в том, что если GUI изменяет некоторые свойства экземпляра PersonDetail и отправляет его обратно на сервер для обновления, я не могу просто присоединить его к своему контексту, поскольку производный класс не сопоставлен ни с одной таблицей («Отображение иНе удалось найти информацию метаданных для EntityType PersonDetail ").Я попытался сопоставить его с той же таблицей, в которой сопоставлен класс Person, но EF выдает определенное исключение в отношении сопоставления таким образом.

Мне удалось обойти это, создав копию экземпляра PersonDetail, скопировав егозначения свойств в новый экземпляр Person, а затем сохраните его в БД.Однако я хотел бы избежать этой дополнительной работы.Что я делаю неправильно?Это не возможно?В Linq to SQL это работало как прелесть, в основном из коробки.

И если это невозможно, каков предлагаемый способ расширить мои классы сущностей с помощью дополнительной информации, которая не должнабыть упорным?(Очевидным способом было бы просто добавить дополнительные свойства к частичному классу Person. Однако я не хочу этого делать, потому что таким образом графический интерфейс никогда не может быть уверен, были ли дополнительные свойства заполнены на сервере или нет.)

ОБНОВЛЕНИЕ: Спасибо за предложения, однако мой главный вопрос все еще открыт: возможно ли иметь базовый и производный класс (где у производного класса нет никаких дополнительных свойств, которые должны быть сохранены вDB) сопоставлен с той же таблицей, чтобы я мог просто присоединить экземпляр производного типа к своему контексту и сохранить его, как если бы это был экземпляр базового типа?Я еще не мог этого сделать, и я удивлен, потому что с Linq to SQL это просто работало.

Ответы [ 3 ]

1 голос
/ 21 октября 2011

Я не думаю, что наследование является правильным ответом на это.Правда ли, что PersonDetail - это Персона?Я бы выбрал создание класса PersonDetail и добавление в частичный класс свойства, которое указывает на экземпляр класса PersonDetail.

Таким образом, на стороне клиента вы можете проверить, установлен ли сервером PersonDetailпросто проверяем, если свойство! = null.

1 голос
/ 21 октября 2011

Вы можете добавить свои свойства в класс и «игнорировать» их для структуры сущностей, используя modelBuilder, похоже, что вы делаете разработку кода сначала. Для этой опции посмотрите на modelBuilder =>

    public class Db : DbContext
    {
      public DbSet<MyClass> MyClasses{ get; set; }

      protected override void OnModelCreating(DbModelBuilder modelBuilder)
      {
        modelBuilder.Entity<MyClass>().Ignore(x => x.MyProperty);
      }
    }

надеюсь, это поможет!

0 голосов
/ 22 октября 2011

Вы пробовали использовать композицию вместо наследования?

public class PersonViewModel {
  public Person Person { get; }
  public int? MyViewProperty { get; set; }
  // ...
}

Если бы не было действительно веской причины, я бы никогда не передал этот объект в вашу службу. Для меня это выглядит только как объект на стороне клиента. Какой смысл передавать свойства графического интерфейса на сервер, если они все равно не сохранены в базе данных? Разве не достаточно просто get Персона и отправить это на сервер для обновления?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...