Как получить идентификатор сущности, используя nhibernate createcriteria - PullRequest
2 голосов
/ 03 мая 2011

Предупреждение для новичка. Я пытаюсь проверить, существует ли сущность в базе данных, если я хочу обновить ее, в противном случае создайте новую сущность.Но использование 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, совпадающий с существующей записью базы данных, и я продолжаю получать нарушение первичного ключа для имени проекта, поскольку база данных ожидает уникальное имя проекта.

  1. Более глупые шаги (я слышу смех) изменил файл отображения, включив в него Map (x => x.Id) .Update (). Insert (), и это привело к тому, что INSERT_IDENTITY установлено в OFF (или что-то еще).

Итак, каков наилучший способ получить сущность с идентификатором Id и впоследствии обновить ее, с моим CreateCriteria что-то не так?

1 Ответ

0 голосов
/ 29 июля 2011

Я полагаю, что вызов метода Merge в сеансе сделает именно то, что вы хотите.

Просто введите объект, который вы хотите обновить / вставить, в качестве аргумента, и он обновит свойства, если объект уже существует, или сохранит новый экземпляр, если его нет.Таким образом, вам не нужно CreateCriteria , и ваше решение будет намного проще.

...