Так как никто не прыгнул на этом, я вышел и начал читать из разных источников в Интернете, чтобы собрать воедино то, что EF4 кажется. Я напишу здесь свои источники, если кому-то в будущем понадобится провести такое расследование.
Вот напыщенная речь о NH против EF, которая многословна, но обсуждает некоторые интересные темы.
Собственная документация Microsoft по EF находится здесь и была несколько полезна, хотя полностью игнорировала отображение POCO и плавные отображения, которые кажутся более NH-подобными.
Существует новое дополнение к ожидающему EF, которое, кажется, имитирует беглые отображения NH. Вот хорошая, простая статья / обзор этой функции и вот ссылка на последний Microsoft CTP-код первого сайта .
Entity SQL является эквивалентом HQL.
Отображение и выполнение хранимых процедур называется «отображением функции» и очень похоже на то, как это делал Linq to SQL, за исключением того, что теперь, как сообщается, гораздо меньше шансов застрять с неизвестным типом результата, поскольку Вы можете явно не возвращать ничего, скаляр, сложный тип или сущность. Вот дополнительная ссылка на sp mapping для EF4.
Кажется, есть несколько способов нанести на карту вашу модель. Использование дизайнера EDMX является полностью автоматизированным способом и, по-видимому, отлично подходит для небольших проектов, где абсолютный контроль над сопоставлениями избыточен.
Есть несколько способов сделать запрос, наиболее дружественным к разработчику кажется LINQ to Entities и, конечно, он похож на LINQ to NH.
Вот другой пример отображения POCO .
В целом текущее состояние EF больше похоже на LINQ to SQL, чем на NHibernate, но, учитывая простоту использования L2S и постоянные инвестиции Microsoft в EF, кажется, что это хорошее начало.
Наконец, так как я разработчик, я не удержался от того, чтобы взять его на тест-драйв. Вот мой совет исследования айсберга. SQL Profiler подтвердил, что активная / отложенная загрузка работает так, как объявлено, и что обновление только обновляет измененные поля.
// LINQ QUERY
using (MsgEntities ctx = new MsgEntities()) {
return (from m in ctx.Messages
where m.SentAt.Month == 11
select m).ToList();
}
// GET ONE WITH OBJECT GRAPH
Message msg = null;
MsgEntities ctx = new MsgEntities();
msg = ctx.Messages // .Include("MessageAttachments.Attachment") -uncomment for eager loading
.Where(m => m.PK_Message == PK_Message).SingleOrDefault();
// ADD
using (MsgEntities ctx = new MsgEntities()) {
ctx.Messages.AddObject(new Message() {
Dsc = "added message @ " + DateTime.Now.ToString("dd-MMM-yy HH:mm:ss"),
OriginalRecipientDsc = "Tahbaza",
Sender = "Tahbaza",
SentAt = new DateTime(2008, 11, 15),
Subject = "Nothing special"
});
}
// UPDATE
Message m = GetOneMessage(3);
using (MsgEntities ctx = new MsgEntities()) {
ctx.Attach(m);
m.Subject = "message UPDATED @ " + DateTime.Now.ToString("dd-MMM-yy HH:mm:ss");
ctx.SaveChanges();
}
// DELETE
Message m = GetOneMessage(3);
using (MsgEntities ctx = new MsgEntities()) {
ctx.Attach(m);
ctx.DeleteObject(m);
ctx.SaveChanges();
}
Надеюсь, это поможет кому-то, где я был 2 дня назад.