Я работаю над несколькими проектами, которые используют одну и ту же «базу».Все они используют 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 и расширять ее на несколько проектов.
Спасибо, что нашли время, чтобы прочитать все это.