Предупреждение для новичка. Я пытаюсь проверить, существует ли сущность в базе данных, если я хочу обновить ее, в противном случае создайте новую сущность.Но использование CreateCriteria всегда возвращает объект без идентификатора?Есть идеи почему?Я использую свободный nhibernate для ручного отображения, то есть использование ClassMap;
Базовый класс - содержит только открытое свойство Id
открытый абстрактный класс EntityBase: IEquatable {public virtual int Id {get;задавать;}
public virtual bool Equals(EntityBase obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (GetType() != obj.GetType()) return false;
return obj.Id == Id;
}
}
MAPPING;
public class ProjectNameMap: ClassMap<ProjectName>
{
public ProjectNameMap()
{
Table("dbo.TABLENAME");
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.PROJECT_NAME).Not.Nullable();
Map(x => x.PROJECT_DESCRIPTION);
}
}
Возвращение сущности;
public static T GetEntityByRestrictions<T>(String propertyName, String propertyValue)
where T:EntityBase
{
using (var session = SessionManager.CreateSessionFactory().OpenSession())
{
using (var transaction = session.BeginTransaction())
{
var entity= session.CreateCriteria<T>(propertyValue)
.Add(Restrictions.Eq(propertyName, propertyValue))
.UniqueResult<T>();
return entity;
}
}
}
}
Два глупых шага, которые я попробовал (не смейтесь) 1. Глупый шаг, который я попытался, состоял в том, чтобы вручную установить Id = 52, совпадающий с существующей записью базы данных, и я продолжаю получать нарушение первичного ключа для имени проекта, поскольку база данных ожидает уникальное имя проекта.
- Более глупые шаги (я слышу смех) изменил файл отображения, включив в него Map (x => x.Id) .Update (). Insert (), и это привело к тому, что INSERT_IDENTITY установлено в OFF (или что-то еще).
Итак, каков наилучший способ получить сущность с идентификатором Id и впоследствии обновить ее, с моим CreateCriteria что-то не так?