dapper map one to one in classmapper

dapper dapper-extensions foreign-key-relationship relation

Question

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

    }
}

Thanks

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


Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Is this KB legal? Yes, learn why
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Is this KB legal? Yes, learn why