7

Ich habe 2 einfache Tabellen.Dapper Karte eins zu eins in classmapper

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 Karte ich diese Tabellen Klassen zu modellieren:

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 adrett und adrett Erweiterung verwenden.

Ich möchte Zuordnung Beziehung eins zu eins in Dapper in classmapper. Es ist möglich?

Mein Ziel ist, wenn ich Eigentümerobjekt hinzugefügt habe, das auch Eigenschaftsstatus zu db über das Repository gesetzt hat, fügt es auch einen Datensatz ein, um eine Statustabelle zu erstellen.

Was ist der beste Weg, um dieses Verhalten zu erreichen?

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

    } 
} 

Dank

Antwort

8

Sie versuchen multi-mapping-Funktion des Dapper können:

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