2013-11-13 2 views
3

Я использую NHibernate в какой-то системе, и я очень доволен тем, как это работает, но я думал, что мне нужно будет переключиться с NHibernate и помещать Entity Framework исключительно для обучения , Однако есть проблема, которую я наткнулся, хотя, в моем домене у меня есть 2 классов (несколько упрощенных примеров)Entity Framework, влияющий на мой домен

public class Post 
{ 
    public Post() 
    { 
     Comments = new List<Comment>(); 
    } 

    public virtual int Id { get; set; } 
    public virtual string Title { get; set; } 
    public virtual string Text { get; set; } 
    public virtual DateTime DatePosted { get; set; } 
    public virtual ICollection<Comment> Comments { get; set; } 
} 

public class Comment 
{ 
    public virtual int Id { get; set; } 
    public virtual string CommentText { get; set; } 
    public virtual Post Post { get; set; } 
} 

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

Но при переходе к EntityFramework, чтобы отношения работали, мне нужно изменить класс Comment, чтобы включить PostId-поле, а также объект Post, чтобы получить отношения как таковые.

public class Comment 
{ 
    public virtual int Id { get; set; } 
    public virtual string CommentText { get; set; } 
    public virtual int PostId { get; set; } // added in for entityframework 
    public virtual Post Post { get; set; } 
    public virtual int UserId { get; set; } 
} 

С помощью этого поля добавляется в мой домен объекта отображения теперь, кажется, работает, но я чувствую себя немного неловко об этом, как он чувствует, как Entityframework если заставляет меня изменить свой домен, и я был под впечатлением, что доменная модель не должна знать ничего о сохранении.

Мне действительно нужно это дополнительное поле PostId, добавленное в мой класс комментариев, чтобы заставить отношения работать, или я делаю что-то неправильно?

Могу ли я быть педантичным в отношении того, что на домен влияет изменение уровня персистентности?

Не имеет полей Post и PostId вместе, как это означает, что если вы измените PostId, вам также придется обрабатывать изменение для обновления поля Post или наоборот в классе Comment?

Благодаря

CD

+0

При создании модели данных в EF вы можете отменить «Включить столбцы внешнего ключа в модели». Однако из памяти это означает, что EF, возможно, придется перейти в БД, чтобы получить Comment.Post.Id, тогда как в NH это не – Rippo

+0

Я не использовал модель данных генерации, мой домен уже был построен, поскольку он работал с существующим db через NHibernate раньше, я унаследовал класс DbContext и добавил любые сопоставления, которые могут возникнуть в переопределении метода OnModelCreating. –

+0

Есть ли причина, по которой 'Post' не является агрегированным корнем? Выполняет ли 'Post' какие-либо инварианты в своих комментариях? – JefClaes

ответ

0

На мой взгляд, это один из основных недостатков Entity Framework. Вы можете заставить EF работать без добавления внешнего ключа, однако ваше приложение должно будет извлечь объект из базы данных, чтобы установить свойство, потому что EF не имеет эквивалента метода ISession.Load NHibernate.

Смежные вопросы