Dapper .Net:テーブルの列とモデルのプロパティタイプの不一致

dapper

質問

実際には、タイプvarcharの列(ex.Address用)を含む結果を返すクエリがありますが、型オブジェクト(ex。Address Address)のプロパティを含むそのテーブルのドメインモデル。キャストできないというエラーが発生します。コメントする文字列.Dapper .netでこの問題を解決する方法を理解できません。

コードスニペット:

IEnumerable<Account> resultList = conn.Query<Account>(@"
                    SELECT * 
                    FROM Account
                    WHERE shopId = @ShopId", 
new {  ShopId = shopId });

Accountオブジェクトは、たとえば、です。

public class Account {
  public int? Id {get;set;}
  public string Name {get;set;}
  public Address Address {get;set;}
  public string Country {get;set;}
  public int ShopId {get; set;}
}

データベーステーブルの列(Address)とドメインモデルのプロパティ(Address)の間に型の不一致があるので、dapperは例外をスローします.Dapperを使ってそのプロパティをマップする方法はありますか。

受け入れられた回答

POCOとデータベースの間に型の不一致があるため、2つの間にマッピングを提供する必要があります。

public class Account {
  public int? Id {get;set;}
  public string Name {get;set;}
  public string DBAddress {get;set;}
  public Address Address 
  {
   // Propbably optimize here to only create it once.
   get { return new Address(this.DBAddress); } 
  }

  public string Country {get;set;}
  public int ShopId {get; set;}
}

そのようなこと-あなたは、プロパティにデシベル列に一致するDBAddress (あなたが好きなエイリアスを提供する必要がSELECT Address as DBAddressの代わりに、*)をし、あなたのgetメソッドを提供Addressの種類再利用/作成したオブジェクトAddressの内容をdb値。


人気のある回答

もう1つの選択肢は、Dapperのマルチマッピング機能を使用することです。

public class TheAccount
{
    public int? Id { get; set; }
    public string Name { get; set; }
    public Address Address { get; set; }
    public string Country { get; set; }
    public int ShopId { get; set; }
}

public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
}

public class Class1
{
    [Test]
    public void MultiMappingTest()
    {
        var conn =
            new SqlConnection(
                @"Data Source=.\SQLEXPRESS; Integrated Security=true; Initial Catalog=MyDb");
        conn.Open();

        const string sql = "select Id = 1, Name = 'John Doe', Country = 'USA', ShopId = 99, " +
                           " Street = '123 Elm Street', City = 'Gotham'";

        var result = conn.Query<TheAccount, Address, TheAccount>(sql, 
            (account, address) =>
                {
                    account.Address = address;
                    return account;
                }, splitOn: "Street").First();

        Assert.That(result.Address.Street, Is.Not.Null);
        Assert.That(result.Country, Is.Not.Null);
        Assert.That(result.Name, Is.Not.Null);
    }
}

これでわかる唯一の問題は、splitOnを動作させるために、すべてのAccountフィールドと、それに続くselectステートメントのAddressフィールドをリストする必要があることです。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow