使用 ASP.NET/C#/fluent Hibernate 架构,我尝试使用 GridView
和 ObjectDataSource
来管理我的业务对象。我有一个主类 Project
与 OIC
具有一对多关系 - 下面简化了映射和类。
// OIC class definition
public partial class OIC
{
public int pkOICID { get; set; }
public string Guarantor { get; set; }
// ... other fields
public Project Project { get; set; }
}
// OIC mapping
public class OICMap : ClassMap<OIC>
{
public OICMap()
{
Table(@"OIC");
LazyLoad();
Id(x => x.pkOICID) // primary key for OIC
.Column("pkOICID")
.Not.Nullable()
.GeneratedBy.Identity();
Map(x => x.Guarantor)
.Column("Guarantor")
.Not.Nullable();
// ...more fields not listed
References(x => x.Project) // foreign key to Project
.Class<Project>()
.Access.Property()
.Cascade.None()
.LazyLoad()
.Columns("fkProjectID");
}
}
// Project class definition
public partial class Project
{
public int pkProjectID { get; set; }
// ...
public Iesi.Collections.ISet OICs { get; set; }
}
// Project mapping
public class ProjectMap : ClassMap<Project>
{
public ProjectMap()
{
Table(@"Project");
LazyLoad();
Id(x => x.pkProjectID)
.Column("pkProjectID")
.Not.Nullable()
.GeneratedBy.Identity();
// ...
HasMany<OIC>(x => x.OICs)
.Access.Property()
.AsSet()
.Cascade.AllDeleteOrphan()
.LazyLoad()
.Inverse()
.Not.Generic()
.KeyColumns.Add("fkProjectID", mapping => mapping.Name("fkProjectID")
.SqlType("int")
.Not.Nullable());
}
}
在对我的存储库进行单元测试时,OIC 类的所有 CRUD 操作都运行良好,因此我知道映射有效。但是,当我使用 GridView
和 ObjectDataSource
尝试删除 OIC 的实例时,我得到“非空属性引用空值或 transient 值 CLS.BusinessLayer。当我尝试提交交易时出现 Model.OIC.Guarantor"异常。
设置断点并检查存储库的 Remove 函数中的对象(下面的代码)显示仅填充了 OIC 对象的主键 - 其余字段为空。
public virtual void Remove(T entity)
{
if (entity == null)
throw new ArgumentNullException("entity");
_session = NHibernateSessionProvider.GetSession();
if (!_session.Transaction.IsActive)
{
try
{
using (ITransaction transaction = _session.BeginTransaction())
{
_session.Delete(entity);
transaction.Commit(); // exception caused here
}
}
catch
{
}
}
else
_session.Delete(entity);
}
如果我删除 OIC 中 Guarantor 属性上的 .Not.Nullable()
,删除工作正常(我只是出于好奇才尝试这样做)。此外,如果我在 GridView
的 DataKeyNames
列表中包含 Guarantor 字段,当我检查 Remove()< 中的对象时,该字段会正确填充
上面的函数,事务提交成功。目前,GridView
仅包含 pkOICID - DataKeyNames
中的主键。
所以我坚持了几件事:
- 如果我只删除一个对象并拥有主键,为什么 nHibernate 会关心其他字段是否为空?
- 更重要的是,我想我一定是在
GridView
或ObjectDataSource
中遗漏了一些东西,这导致对象在被删除之前没有被完全填充 - 这是什么东西需要在ObjectDataSource_Deleting()
或其他地方完成?
如果需要更多代码或解释,请告诉我 - 谢谢。
最佳答案
当只有 id 已知/填充时,这应该可以删除
session.Delete(Session.Get(entity.GetType(), entity.Id);
关于c# - "not-null property references a null or transient value"删除对象时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14880336/