【问题标题】:How do I handle nested NPoco objects that may be null?如何处理可能为空的嵌套 NPoco 对象?
【发布时间】:2013-09-29 23:42:34
【问题描述】:

我正在使用 NPoco 从我的数据库中进行对象映射。我有以下实体:

public abstract class NamedEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Person : NamedEntity
{
    public Office Office { get; set; }
}

public class Office : NamedEntity
{
    public Address Address { get; set; }
    public Organisation ParentOrganisation { get; set; }
}

public class Address
{
     public string AddressLine1 { get; set; }
}

public class Organisation : NamedEntity
{
}

我正在我的存储库中使用 NPoco 检索对象:

var people = Context.Fetch<Person, Office, Address, Organisation>(sql);

这工作正常,除了Person 没有Office 的情况,在这种情况下,sql 查询中LEFT JOIN 的结果对于 Office、Address 和 Organization 列返回 null。

在这种情况下,NPoco 会抛出一个未处理的异常:

System.Reflection.TargetInvocationException: 
Exception has been thrown by the target of an invocation. 
---> System.NullReferenceException: 
Object reference not set to an instance of an object.
at poco_automapper(Person , Office , Address , Organisation )
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Delegate.DynamicInvokeImpl(Object[] args)
at NPoco.MultiPocoFactory.CallCallback[TRet](Delegate callback, IDataReader dr, Int32 count)
at NPoco.MultiPocoFactory.<>c__DisplayClassa`1.<CreateMultiPocoFactory>b__9(IDataReader reader, Delegate arg3)
at NPoco.Database.<Query>d__14`1.MoveNext()

有没有办法处理这种情况?还是我必须求助于扁平对象或单独的数据库调用?

【问题讨论】:

  • 嘿,我是 NPoco 的主要开发人员。我实际上并不知道支持这种情况。它将支持一个具有嵌套类的类,但它们也不能具有嵌套类。如果在有办公室数据时这确实有效,请您在github.com/schotime/NPoco/issues 上提出问题,我会仔细研究一下。
  • 那么这个几乎起作用的功能是你不知道的吗?

标签: c# asp.net-mvc-4 petapoco npoco


【解决方案1】:

此问题已在 NPoco 2.2.40 中修复。
感谢您的报告。

【讨论】:

    【解决方案2】:

    尝试创建一个构造函数来初始化对象:

    public abstract class NamedEntity
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    
    public class Person : NamedEntity
    {
        public Person()
        {
            Office = new Office();
        }
        public Office Office { get; set; }
    }
    
    public class Office : NamedEntity
    {
        public Office()
        {
            Address = new Address();
            ParentOrganisation = new Organisation();
        }
        public Address Address { get; set; }
        public Organisation ParentOrganisation { get; set; }
    }
    
    public class Address
    {
        public string AddressLine1 { get; set; }
    }
    
    public class Organisation : NamedEntity
    {
    }
    

    【讨论】:

    • 这不起作用。错误出现在 NPoco 映射器中,我认为是因为 Office 对象为空,并且它仍尝试映射地址和组织数据。
    猜你喜欢
    • 2016-08-26
    • 2023-03-18
    • 1970-01-01
    • 2019-10-13
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    相关资源
    最近更新 更多