Создание базовых моделей и расширение для разных проектов (Linq2SQL) - PullRequest
0 голосов
/ 06 марта 2012

Я работаю над несколькими проектами, которые используют одну и ту же «базу».Все они используют Linq2SQL в качестве ORM, для тех, кто не знаком с L2S, 1-n табличные реализации выражаются как EntitySet, а 1-1 - как свойство (public OtherTable PropName {get; set;}).

Я пытаюсь создать один базовый проект, содержащий модели, которые будут использоваться несколькими проектами.И проекты должны иметь возможность расширять эти модели и создавать новые / переопределенные свойства (которые будут сохранены в БД), и то же самое для методов.

Все проекты используют шаблон репозитория для доступа к возвращаемым БДIQuerables или примитивный тип.И DataContext вводится HttpRequest.

Я думаю, что будет легче объяснить, приводя примеры.Так что мой класс User в BaseProject.Core будет иметь следующий вид: (Трудно добавить все реквизиты как виртуальные, используя инструмент L2S, если я удаляю таблицу и снова перетаскиваю из БД, мне придется вручную снова менять их все)

public partial class User
    {
        public virtual Int32 Id { get; set; }
        public virtual DateTime? BirthDate { get; set; }
        public virtual EntitySet<BaseProject.Core.UserData> UserDatas;
        }
public partial class UserData
    {
        public virtual Int32 Id { get; set; }
        public virtual Int32 ProcessId { get; set; }
    }

И один из проектов, который расширит его (CurrentProject.Core):

public partial class User : BaseProject.Core.User
    {
        public override Int32 Id { get; set; }
        public override DateTime? BirthDate { get; set; }
        public override EntitySet<CurrentProject.Core.UserData> UserDatas;
        public string Email { get; set; }
    }
public partial class UserData : BaseProject.Core.UserData
    {
        public override Int32 Id { get; set; }
        public override Int32 ProcessId { get; set; }
        public string MyNewProp { get; set; }
    }

У меня есть новый текстовый текст данных (я расширил базовый текст данных BaseProject.Core), и повторно-таскивая таблицы, чтобы получить новые свойства для нового пользовательского класса, я должен установить ВСЕ свои свойства для переопределения в dbml, чтобы убедиться, что я могу использовать их как в методах базового класса, так и в расширенном классе (вместо того, чтобы отмечать переопределение I,может удалить каждое свойство в dbml, но я все еще не уверен, что это лучший способ сделать это.)

Конечно, идея, предложенная мной выше, не будет работать, даже не компилируется (другой класс напереопределенный метод).

Одним из решений было бы не связывать их вообще в базовом проекте, но это лишило бы меня возможности создавать отношения в базовом проекте, используя набор сущностей, поэтому мне нужно было бы запросить базу данных, используярепозитории вместо моделей, но это помешает мне использовать что-то в базовом проекте, например:

dc.User.Where(x=>x.UserDatas.Count(y=>y.ProcessId == 1) == 0)

Так что я надеюсь, что кто-то может дать мне какую-то идею илиновая отправная точка о том, как создавать базовые объекты в основной DLL и расширять ее на несколько проектов.

Спасибо, что нашли время, чтобы прочитать все это.

1 Ответ

0 голосов
/ 08 марта 2012

Думаю, вам больше повезет, если вы сначала используете код Entity Framework.

Вот хорошая статья на этот счет, если вы не знакомы: http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

Не работал с нимДостаточно сказать, возможно ли иметь объекты данных, которые расширяют друг друга объектно-ориентированным способом.Я бы сказал, что это нетрадиционно, хотя лучшим подходом может быть наличие уровня доступа к данным (DAO), который мог бы быть ОО в том смысле, что он простирается друг от друга.Следует учитывать, что в L2SQL есть ограничение, заключающееся в том, что вы не можете выполнять запросы к объектам, которые находятся в разных данных.

...