как получить идентификатор объекта с помощью nhibernate createcriteria

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

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

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


person Ots K    schedule 03.05.2011    source источник
comment
Вы смотрели журналы, чтобы узнать, какие запросы он действительно выполняет к базе данных?   -  person Cole W    schedule 03.05.2011
comment
Вы действительно не хотите создавать новую фабрику сеансов каждый раз, когда вам нужна сущность.   -  person James Gregory    schedule 04.05.2011


Ответы (1)


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

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

person docmanhattan    schedule 29.07.2011