";not null属性引用null或瞬态值“;删除对象时

本文关键字:null 删除 对象 not quot 属性 引用 | 更新日期: 2023-09-27 17:59:38

使用ASP.NET/C#/fluent Hibernate架构,我尝试使用GridViewObjectDataSource来管理我的业务对象。我有一个主类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操作都能完美地工作,所以我知道映射是有效的。然而,当我使用GridViewObjectDataSource尝试删除OIC的实例时,当我尝试提交事务时,我会得到一个"not null property references a null or transient value CLS.BusinessLayer.Model.IOIC.Guaranter"异常。

在存储库的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担保人财产上的.Not.Nullable(),删除操作很好(我只是出于好奇才尝试)。此外,如果我在GridViewDataKeyNames列表中包括担保人字段,则当我在上面的Remove()函数中检查对象时,该字段将被正确填充,并且事务成功提交。目前,GridView只在DataKeyNames中包含pkOICID——主键。

因此,有几件事我被卡住了:

  1. 如果我只是删除一个对象并拥有主键,为什么nHibernate会关心其他字段是否为空
  2. 更重要的是,我想我在GridViewObjectDataSource中一定遗漏了一些东西,导致对象在删除之前没有完全填充——这是需要在ObjectDataSource_Deleting()或其他地方完成的吗

如果需要更多的代码或解释,请告诉我-谢谢。

";not null属性引用null或瞬态值“;删除对象时

当只有id已知/填充时,这应该可以删除

session.Delete(Session.Get(entity.GetType(), entity.Id);