7

Mam 2 proste tabele.najlepsza mapa jeden do jednego w 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), 
); 

W aplikacji mapować te tabele do modelowania klas:

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

używam Wytworny i Wytworny rozszerzenie.

Chciałbym relacji mapy jeden do jednego w eleganckim w classmapper. To jest możliwe?

Mój cel jest taki, że dodałem obiekt właściciela, który skonfigurował także właściwość Stan do bazy danych poprzez repozytorium , a także wstawił rekord do tabeli stanu.

Jaki jest najlepszy sposób na osiągnięcie tego zachowania?

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

    } 
} 

Dzięki

Odpowiedz

8

Można spróbować Wytworny za multi-mapping cechę:

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