Я только начинаю работать с .NET ORM до такой степени, что даже не решил между Entity Framework и NHibernate. Но в обоих случаях я сталкиваюсь с проблемой, заключающейся в том, что они, кажется, хотят, чтобы я различными способами нарушил целостность моей модели предметной области, особенно в тонкостях проектирования объектов C #. Это один из нескольких вопросов по теме.
Я очень привык обеспечивать неизменность соответствующих свойств с помощью шаблона, который выглядит следующим образом:
public class Foo
{
private readonly string bar;
public string Bar { return this.bar; }
public Foo(string bar)
{
this.bar = bar;
}
}
Похоже, что это не поддерживается NHibernate или Entity Framework. Им нужны конструкторы по умолчанию и public
сеттеры; похоже, что даже private
сеттеры (и конструкторы по умолчанию) работают (иногда?), потому что ORM могут использовать отражение.
Я полагаю, что могу обойти это, используя private
сеттеры и private
конструктор по умолчанию. По крайней мере, тогда публичный API не будет скомпрометирован. Просто я модифицирую все реализации своих классов, чтобы добавить неиспользуемые private
конструкторы, и необходимость доверять future-Domenic, что он понимает private
на моих установщиках, на самом деле означает «не звоните мне, кроме как в конструкторе». Уровень сохраняемости просачивается в мой объектный дизайн предметной области.
Это также кажется ненужным - почему ORM не может знать, что использовать конструктор, отличный от конструктора по умолчанию? Может быть, они могут это сделать, и я просто не нашел нужного сообщения в блоге, объясняющего, как это сделать.
Наконец, в некоторых случаях мои неизменяемые объекты значений действительно хорошо подходят (неизменяемые) типы значений, то есть struct
s. Я предполагаю, что это возможно, поскольку в базе данных поля моей структуры будут отображаться в той же строке, что и родительский объект. Вы можете подтвердить / опровергнуть? Это сообщение в блоге выглядит многообещающим, поскольку дает утвердительный ответ, но количество кода (что на самом деле характерно для рассматриваемого типа значения) ошеломляет.
Разочаровывает, что после нескольких лет чтения таких книг, как Effective C # или блогов, подобных блогам Эрика Липперта, в которых даются отличные советы о том, как создавать выразительные и пуленепробиваемые объекты C #, необходимость использования ORM заставляет меня бросать большая часть этих знаний за окном. Я надеюсь, что кто-то здесь сможет указать, в чем я ошибаюсь, - либо в моем понимании их возможностей, либо в моих размышлениях о моделировании предметной области и роли ORM.