1

データベースからのオブジェクト マッピングに 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()

この状況を処理する方法はありますか? それとも、フラット化されたオブジェクトや別のデータベース呼び出しに頼る必要がありますか?

4

2 に答える 2

0

オブジェクトを初期化するコンストラクタを作成してみてください。

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
{
}
于 2013-09-24T16:57:41.290 に答える