이 nhibernate.propertyaccessexception을 진단/수정하려면 어떻게해야합니까?
-
20-09-2019 - |
문제
다음의 유창한 nhibernate 맵을 감안할 때 :
public class FastTrackPackageClassMap : ClassMap<FastTrackPackage>
{
public FastTrackPackageClassMap()
{
Id(x => x.Id);
References(x => x.UserCreated, "UserIdCreated").Cascade.None();
References(x => x.UserSent, "UserIdSent").Nullable().Cascade.None();
HasMany(x => x.GetFileHeaders()).KeyColumn("PackageId").ForeignKeyConstraintName("PackageId").Cascade.AllDeleteOrphan().Not.LazyLoad().Inverse();
HasMany(x => x.GetEmailRecords()).KeyColumn("PackageId").ForeignKeyConstraintName("PackageId").Cascade.AllDeleteOrphan().Not.LazyLoad().Inverse();
HasMany(x => x.GetPaymentRecords()).KeyColumn("PackageId").ForeignKeyConstraintName("PackageId").Cascade.AllDeleteOrphan().Not.LazyLoad().Inverse();
HasMany(x => x.GetFileTrailers()).KeyColumn("PackageId").ForeignKeyConstraintName("PackageId").Cascade.AllDeleteOrphan().Not.LazyLoad().Inverse();
Map(x => x.TestPackage);
Map(x => x.DateTimeCreated).Generated.Insert();
Map(x => x.DateTimeSent).Nullable();
}
}
public class FileHeaderFastTrackRecordClassMap : ClassMap<FileHeaderFastTrackRecord>
{
public FileHeaderFastTrackRecordClassMap()
{
Id(FileHeaderFastTrackRecord.Expressions.Id);
References(x => x.Package, "PackageId");
Map(x => x.FileDateTime);
Map(x => x.CustomerId);
Map(x => x.TestPackage, "TestIndicator").CustomType(typeof (TestPackageUserType));
Map(x => x.BankId);
}
}
... 그리고 주어진 사용자 정의 사용자 유형 :
public class TestPackageUserType : IUserType
{
public bool Equals(object x, object y)
{
if (x == null)
return false;
return x.Equals(y);
}
public int GetHashCode(object x) { return x.GetHashCode(); }
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
var testIndicator = (char) NHibernateUtil.Character.NullSafeGet(rs, names[0]);
return testIndicator == 'T';
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
if (value == null)
{
NHibernateUtil.Character.NullSafeSet(cmd, null, index);
return;
}
if ((bool) value) { NHibernateUtil.Character.NullSafeSet(cmd, 'T', index); }
else { NHibernateUtil.Character.NullSafeSet(cmd, 'P', index); }
}
public object DeepCopy(object value)
{
if (value == null) return true;
return (bool) value;
}
public object Replace(object original, object target, object owner)
{
if (target != null && !(bool) target)
{
return 'P';
}
return 'T';
}
public object Assemble(object cached, object owner) { throw new NotImplementedException(); }
public object Disassemble(object value)
{
if (value != null)
{
var testIndicator = (char[]) value;
if (testIndicator[0] == 'P')
{
return false;
}
}
return true;
}
public SqlType[] SqlTypes { get { return new[] {new SqlType(DbType.String)}; } }
public Type ReturnedType { get { return typeof (bool); } }
public bool IsMutable { get; private set; }
}
나는 다음과 같은 예외를 받고 내가 쌓을 때 스택을받습니다 Update
Merge
어린이 파일 헤드 헤드 프레스 트랙 크레코드가있는 FastTrackPackage :
NHibernate.PropertyAccessException: Invalid Cast (check your mapping for property type mismatches); setter of BNYM_Extranet.Common.RemEDIFastTrack.FileHeaderFastTrackRecord
at NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(Object entity, Object[] values)
at NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValues(Object entity, Object[] values)
at NHibernate.Persister.Entity.AbstractEntityPersister.SetPropertyValues(Object obj, Object[] values, EntityMode entityMode)
at NHibernate.Event.Default.DefaultMergeEventListener.CopyValues(IEntityPersister persister, Object entity, Object target, ISessionImplementor source, IDictionary copyCache)
at NHibernate.Event.Default.DefaultMergeEventListener.EntityIsDetached(MergeEvent event, IDictionary copyCache)
at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge(MergeEvent event, IDictionary copyCache)
at NHibernate.Impl.SessionImpl.FireMerge(IDictionary copiedAlready, MergeEvent event)
at NHibernate.Impl.SessionImpl.Merge(String entityName, Object obj, IDictionary copiedAlready)
at NHibernate.Engine.CascadingAction.MergeCascadingAction.Cascade(IEventSource session, Object child, String entityName, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeToOne(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeAssociation(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeProperty(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeCollectionElements(Object child, CollectionType collectionType, CascadeStyle style, IType elemType, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeCollection(Object child, CascadeStyle style, Object anything, CollectionType type)
at NHibernate.Engine.Cascade.CascadeAssociation(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeProperty(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeOn(IEntityPersister persister, Object parent, Object anything)
at NHibernate.Event.Default.DefaultMergeEventListener.CascadeOnMerge(IEventSource source, IEntityPersister persister, Object entity, IDictionary copyCache)
at NHibernate.Event.Default.DefaultMergeEventListener.EntityIsDetached(MergeEvent event, IDictionary copyCache)
at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge(MergeEvent event, IDictionary copyCache)
at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge(MergeEvent event)
at NHibernate.Impl.SessionImpl.FireMerge(MergeEvent event)
at NHibernate.Impl.SessionImpl.Merge(String entityName, Object obj)
at NHibernate.Impl.SessionImpl.Merge(Object obj)
at DAL.NHibernate.RepositoryWithTypedId`2.Update(T entity) in Repository.cs: line 72
at UnitTests.DAL.NHibernate.RemEDIFastTrack.FastTrackPackageRepositoryFixture.Update() in FastTrackPackageRepositoryFixture.cs: line 290
내가 Save
FileHeaderFastTrackRecord가있는 FastTrackPackage는 오류가 발생하지 않으며 제대로 저장됩니다. 나도 할 수있어 Save
그리고 Update
FileHeaderFastTrackRecords 독립적으로.
이 시점에서 나는 손실에있다. 사용자 정의 사용자 유형을 의심하지만 확실하지 않습니다.
이 문제를 진단하거나 수정하려면 어떻게해야합니까?
해결책
'TestPackageUserType.replace ()'메소드가 잘못되었습니다. 부울을 반환하고 코드를 더 아래로 내려야 할 때 숯을 반환하고있었습니다 (암호 예외 메시지 제공). 나의 새로운 Replace()
메소드는 다음과 같습니다.
public object Replace(object original, object target, object owner)
{
return original;
}
제휴하지 않습니다 StackOverflow