Код Entity Framework первый вопрос наследования - PullRequest
1 голос
/ 19 сентября 2011

У меня есть реализация кода для текущей иерархии,

 BaseContact{
   Public int Id{get;set;}
   public string Name{get;set;} 
//..
 }

 Person:BaseContact{

   public string Designation{get;set;} 
//..
 }
Company:BaseContact{
     public int NumOfEmployees{get;set;} 
//..
 }

Я хочу идентифицировать человека или компанию, используя только значение Id?В настоящее время я использую рефлексию, чтобы определить, является ли это человек или компания.Есть ли другой способ определить это, не делая слишком много?

Ответы [ 2 ]

6 голосов
/ 19 сентября 2011

Не видя, как вы инициализировали свои классы, я собираюсь предположить, что у вас есть таблица для каждого конкретного типа.

Вы не можете сделать это только по идентификатору, поскольку вы не знаете, к какой таблице принадлежит идентификатор. Идентификатор 2 в таблице «Персона» отличается от идентификатора 3 в «Компании». Единственный практический способ идентификации только по идентификатору - использование подхода «Таблица на иерархию» и проверка дескриптора типа.

Несколько хороших ссылок http://weblogs.asp.net/manavi/archive/2011/01/03/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines.aspx

http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph.aspx

Вы также можете использовать простое утверждение вместо отражения. Т.е. if (entity is Company)

4 голосов
/ 26 сентября 2011

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

 public enum MyType
    {
     Person, 
     Company,
    };

    public abstract class BaseContact{
       public abstract MyType ContactType{get;}   
     }

    public class Person:BaseContact
   {

    public override MyType ContactType
    {
      get
      {
        return MyType.Person;
      }      
    }
   }

public class Company:BaseContact
{
    public override MyType ContactType
    {
      get
       {
         return MyType.Company;
       }  
    } 
 }

Используйте свой репозиторий BaseContact дляизвлекайте сущности и используйте enum для разделения типов.

...