c# - "not-null property references a null or transient value"删除对象时

标签 c# asp.net gridview fluent-nhibernate objectdatasource

使用 ASP.NET/C#/fluent Hibernate 架构,我尝试使用 GridViewObjectDataSource 来管理我的业务对象。我有一个主类 ProjectOIC 具有一对多关系 - 下面简化了映射和类。

// 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 的实例时,我得到“非空属性引用空值或 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(),删除工作正常(我只是出于好奇才尝试这样做)。此外,如果我在 GridViewDataKeyNames 列表中包含 Guarantor 字段,当我检查 Remove()< 中的对象时,该字段会正确填充 上面的函数,事务提交成功。目前,GridView 仅包含 pkOICID - DataKeyNames 中的主键。

所以我坚持了几件事:

  1. 如果我只删除一个对象并拥有主键,为什么 nHibernate 会关心其他字段是否为空?
  2. 更重要的是,我想我一定是在 GridViewObjectDataSource 中遗漏了一些东西,这导致对象在被删除之前没有被完全填充 - 这是什么东西需要在 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/

相关文章:

c# - 在 .NET 中从 NetworkStream 读取的正确方法是什么

c# - 将 UTC 日期时间转换为另一个时区

使用 AJAX/JSON 的 ASP.NET MVC 异常处理

javascript - 如何检查使用 JQuery 的 AJAX 调用的 ResultSet 是否有值(value)

c# - gridview e.CommandArgument 字符串格式不正确

C#继承问题

c# - Mono Cecil 和 NRefactory 之间有什么关系,如何将它们与 Roslyn 进行比较?

c# - ASP.NET 双列表框使用 JQuery 更新了客户端,以及如何在服务器端检索结果

android - NullPointerException 与 SimpleCursorAdapter

asp.net - 将数据表绑定(bind)到 GridView