Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

dapper map one to one in classmapper

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

    }
}
like image 857
imodin Avatar asked Aug 21 '13 15:08

imodin


1 Answers

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();
}
like image 191
Void Ray Avatar answered Oct 24 '22 04:10

Void Ray