dapper map one to one in classmapper
Asked Answered
C

1

9

I have 2 simple tables.

create table Owner
(
    Id int primary key,
    Name nvarchar(100),
);

create table Status
(
    Id int primary key,
    BrandName nvarchar(50)
    OwnerId int foreign key references Owner(Id),
);

In app I map these tables to model classes:

public class Owner
{
    public int Id {get;set;}
    public string Name{get;set;}
    public Status Status {get;set;}
}


public class Status
{
    public int Id {get;set;}
    public string Brand {get;set;}
    public int OwnerId {get;set;}
}

I use dapper and dapper extension.

I would like map relation one to one in dapper in classmapper. It’s possible?

My goal is when I added owner object which has set up also property Status to db via repository it also insert record do status table.

What is best way to achieve this behavior?

public class OwnerMapper : ClassMapper<Owner>
{
    public OwnerMapper()
    {
        Table("Owner");
        Map(p=>p.Id).Column("Id").Key(KeyType.Assigned);
        Map(p=>p.Name).Column("Name");
        //how map property status

    }
}


public class StatusMapper : ClassMapper<Status>
{
    public StatusMapper()
    {
        Table("Status");
        Map(p=>p.Id).Column("Id").Key(KeyType.Identity);
        Map(p=>p.Brand).Column("BrandName");
        Map(p=>OwnerId).Column("OwnerId");

    }
}
Curtsey answered 21/8, 2013 at 15:40 Comment(0)
U
14

You can try Dapper's multi-mapping feature:

[Test]
public void MyTest()
{
    var connection = new SqlConnection("conn string here");
    connection.Open();

    const string sql = 
        "select Id = 1, Name ='Bill Gates', Id = 1, Brand = 'Apple', OwnerId = 1";
    var result = connection.Query<Owner, Status, Owner>(sql,
                                           (owner, status) =>
                                               {
                                                   owner.Status = status;
                                                   return owner;
                                               },
                                           commandType: CommandType.Text
        ).FirstOrDefault();
    Assert.That(result, Is.Not.Null);
    Assert.That(result.Status, Is.Not.Null);
    Assert.That(result.Status.Brand, Is.EqualTo("Apple"));
    connection.Close();
}
Unbending answered 21/8, 2013 at 18:35 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.