Внедрение NHibernate 'Bags' в Entity Framework - PullRequest
4 голосов
/ 12 августа 2011

Я недавно начал использовать EF с Code First и столкнулся с этой проблемой, которая оставила меня в недоумении. Буду признателен за любые отзывы на эту тему, которые помогут мне в решении указанной проблемы.

Пожалуйста, рассмотрите следующий образец ....

public class SomeType
{
    public SomeType()
    {
        Properties = new List<BaseProperty>();
    }

    public int PrimaryKey { get; set; }
    public string Name { get; set; }
    public List<BaseProperty> Properties { get; set; }
}

public abstract class BaseProperty
{
    public int PrimaryKey { get; set; } 
    public string PropertyName { get; set; }

    // FK set through Type Configuration File.
    public SomeType ParentInstance { get; set; }
}

public class PropertyA : BaseProperty
{
    // some unique properties.
}

public class PropertyB : BaseProperty
{
    // some unique properties.
}

public class PropertyC : BaseProperty
{
    // some unique properties.
}

public class PropertyD : BaseProperty
{
    // some unique properties.
}

Все это прекрасно работает с соответствующими классами конфигурации типов, которые отображаются на 2 таблицы (1 для SomeType и вторая для BaseProperty вместе с оставшимися производными объектами посредством использования столбца дискриминатора).

Теперь, из-за обстоятельств, не зависящих от меня, я вынужден изменить «SomeType» на что-то подобное ...

public class SomeType
{
    public SomeType()
    {
        PropertiesAB = new List<BaseProperty>();
        PropertiesC = new List<PropertyC>();
        PropertiesD = new List<PropertyD>();
    }

    public int PrimaryKey { get; set; }
    public string Name { get; set; }

    public List<BaseProperty> PropertiesAB { get; set; }        // collection of PropertyA and PropertyB
    public List<PropertyC> PropertiesC { get; set; }        // collection of PropertyC
    public List<PropertyD> PropertiesD { get; set; }        // collection of PropertyD
}

Это было бы очень легко сделать в NHibernate с использованием пакетов, но есть ли эквивалентное значение для этого в EF с использованием Code First? Какие-нибудь мысли ? Я не хочу писать свою собственную реализацию Коллекции, которая будет перенаправлять и манипулировать всеми операциями, которые должны выполняться над этими новыми списками, в основной список, который будет фактически отображен в базу данных.

Пожалуйста, игнорируйте любые отсутствующие "виртуальные" модификаторы или что-либо еще в приведенном выше коде, так как он предназначен только для примера и на самом деле НЕ является тем, что я использую.

Спасибо за ваши ответы.

1 Ответ

0 голосов
/ 27 апреля 2012

Что еще хуже, вы можете сделать что-то вроде этого:

public class SomeType
{
   public SomeType()
   {
      Properties = new List<BaseProperty>();
   }

   public int PrimaryKey { get; set; }
   public string Name { get; set; }
   public List<BaseProperty> Properties { get; set; }

   public List<BaseProperty> PropertiesAB 
   { 
      get
      {
         return Properties.Where(p=>p is PropertyA || p is PropertyB);
      } 
      set
      {
         //Remove all the properties already in the Properties collection of
         //the type A and B and then
         Properties.AddRange(value)
      } 
   }
   //Same with rest of the properties
}

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

...