Уведомление для новичков Я пытаюсь проверить, существует ли объект в базе данных, если я хочу обновить его, иначе создайте новый объект. Но использование CreateCriteria всегда возвращает объект без идентификатора? Есть идеи, почему? Я использую беглый nhibernate для ручного сопоставления, то есть использования ClassMap;
Базовый класс - хранит только общедоступное свойство Id
общедоступный абстрактный класс EntityBase: IEquatable {общедоступный виртуальный идентификатор int {получить; набор; }
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;
}
}
КАРТИРОВАНИЕ;
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 (или что-то в этом роде).
Итак, как лучше всего получить объект с идентификатором и затем обновить его, что-то не так с моим CreateCriteria?