dapper map one to one in classmapper

15k views Asked by At

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");

    }
}
1

There are 1 answers

0
Void Ray On BEST ANSWER

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();
}