У меня есть объект с CompositeId, который не будет вставлять новые строки в базу данных с помощью SaveOrUpdateCopy. Оператор INSERT, сгенерированный NHibernate, заполняется знаком "?" для значения каждого поля. Он отлично вставляется с помощью SaveOrUpdate, он прекрасно обновляется либо с помощью SaveOrUpdateCopy или SaveOrUpdate, а любой объект без CompositeId вставляет / обновляет нормально с помощью SaveOrUpdateCopy. Я не хочу создавать if / then поиск сущностей с CompositeId, чтобы решить, следует ли использовать SaveOrUpdate или SaveOrUpdateCopy. Есть ли какая-то хитрость, чтобы SaveOrUpdateCopy работал с сущностями с CompositeId?
Вот код (имена изменены, чтобы защитить невинных):
public class MyEntity
{
public virtual Int32 FirstProperty { get; set; }
public virtual string SecondProperty { get; set; }
public virtual string DataText { get; set; }
public override int GetHashCode( )
{
int hashCode = 0;
hashCode = hashCode ^ FirstProperty.GetHashCode() ^
SecondProperty.GetHashCode();
return hashCode;
}
public override bool Equals( object obj )
{
MyEntity toCompare = obj as MyEntity;
if( toCompare == null )
{
return false;
}
return ( GetHashCode() != toCompare.GetHashCode() );
}
}
public MyEntityMap()
{
CompositeId()
.KeyProperty(x => x.FirstProperty, "first_property")
.KeyProperty(x => x.SecondProperty, "second_property");
Map(x => x.DataText, "data_text")
.Nullable();
Table("dbo.my_entity");
}
вызов базы данных:
public MyEntity GetMyEntity(long firstProperty, string secondProperty)
{
using (var session = sessionFactory.OpenSession())
{
var result = from entity in
session.Linq()
where entity.FirstProperty == firstProperty
&& entity.SecondProperty== secondProperty
select entity;
return result.Count() > 0 ? result.First() : null;
}
}
Сохранение базы данных:
using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
try
{
session.SaveOrUpdateCopy(entity);
transaction.Commit();
}
catch(Exception ex)
{
transaction.Rollback();
throw;
}
}
}