Наследование структуры сущностей - PullRequest
0 голосов
/ 09 октября 2010

Я постараюсь объяснить проблему, с которой я сейчас сталкиваюсь, как можно проще.Проект, над которым я сейчас работаю, необходим для анализа некоторых финансовых данных.Для удобства эти данные должны храниться в базе данных, поэтому мне поручено создать модель базы данных.Хотя база данных не требовалась до сих пор, само приложение разрабатывалось в течение ряда лет и уже имеет все определенные типы данных и классы, поэтому моя задача - сопоставить модель базы данных с классами, используемыми приложением.Вот упрощенная разбивка состава класса, используемого приложением для работы с данными.Начнем с того, что существует абстрактный класс Entry, от которого наследуются все остальные записи финансовых данных:

abstract class Entry
{
    public Guid ID { get; set; }
    public string Name { get; set; }
}

Различные финансовые данные представлены в разных форматах и ​​относятся к разным моментам времени.Чтобы отразить это, есть ряд интерфейсов, которые реализованы конкретными типами данных.В качестве примера, скажем, что все данные могут быть относительно определенного момента времени или периода времени.Возьмите курс валюты, например.Это меняется только один раз в день.ВВП, с другой стороны, обычно предоставляется на определенный период (квартальный или годовой).Это отражено в приведенных ниже классах.

class SingleDateEntry : Entry
{
    public DateTime Date { get; set; }
}

class PeriodEntry : Entry
{
    public DateTime PeriodStart { get; set; }
    public DateTime PeriodEnd { get; set; }
}

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

interface ISingleValueEntry
{
    public double Value { get; set; }
}

interface IMinMaxEntry
{
    public double MinPrice { get; set; }
    public double MaxPrice { get; set; }
}

interface IOpenCloseEntry
{
    public double OpenPrice{get;set;}
    public double ClosePrice{get;set;}
}

Например, ежедневный курс валюты, поскольку он связан с одним днем ​​в прошлом и имеет только одно значение, может быть представлен классом, который выглядит следующим образом:

class DailyCurrencyRate : SingleDateEntry, ISingleValueEntry
{
}

Цены на акции имеют ряд различных значений, связанных с ними, поэтому они могут быть представлены следующим образом:

class DailyStockPrice : SingleDateEntry, IOpenCloseEntry, IMinMaxEntry
{
}

И, наконец, ВВП, поскольку он связан с периодом времени и имеет единственное значение, будет выглядеть так:

class GDP : PeriodEntry, ISingleValueEntry
{
}

К сожалению, я раньше не работал с EF, и когда я пытался реализовать этот упрощенный сценарий реальной проблемы, я столкнулся с рядом проблем, поэтомуБуду признателен за любые предложения, которые могут помочь мне решить их.Начнем с того, как бороться с несколькими реализациями интерфейса?Насколько я знаю, EF не поддерживает множественное наследование, и, используя ассоциации, я не получаю классы, которые их реализуют, а генерирует классы, которые содержат ссылки на объекты, которые реализуют эти интерфейсы, что плохо, посколькуt соответствует интерфейсу, ожидаемому приложением.Кроме того, какой тип наследования следует использовать в этом сценарии?Из того, что я понял после моего исследования, TPC была бы лучшей стратегией, но я могу ошибаться в этом.Заранее благодарим за любые советы, предложения и "ошибки".

1 Ответ

1 голос
/ 10 октября 2010

Множественное наследование не предоставляется платформой .NET, и вы не используете множественное наследование.Каждый ваш класс наследует только от одного родительского класса.Я только что протестировал простой сценарий с подходом Code first (не является частью EF4.0).Я смоделировал три класса в A, B, унаследованных от A и C, унаследованных от B. Я без проблем сохранил C как TPH ( TPH для кода в первую очередь).Он также будет работать с общим подходом EF.

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