2013-12-20 57 views
1

首先,我没有与dapper.net太多的经验,也许这个问题有简单的解决方案。地图SQL列类属性

我想使用多映射功能。

我简化了我的问题。

我有2个表。

第一表

CARS

色谱柱:

  • card_id的(PK)
  • CAR_LOCATION
  • CAR_STATUS

个第二表

BRANDS

色谱柱:

  • ID(PK)
  • card_id的(FK)
  • BRAND_NAME
  • BRAND_LOGO

我需要执行这个查询:

SQL_CMD:

SELECT * FROM CARS 
LEFT JOIN BRANDS 
ON CARS.CARD_ID = BRANDS.CARD.ID; 

在.NET应用程序,我在2个POCO类,这些表映射。

public class Car 
{ 
    public int CarId {get;set} 
    public string CarLocation {get;set;} 
    public string CarStatus {get;set;} 
    public Brand Brand {get;set;} 
} 

public class Brand 
{ 
    public int Id {get;set} 
    public int CardId {get;set;} 
    public string BrandName {get;set;} 
    public string BrandLogo {get;set;} 
} 

当我查询上面的SQL CMD:

 var data = connection.Query<Car, Brand, Car>(SQL_CMD, (car, brand) => 
     { 
      car.Brand = brand; 
      return car; 

     }, commandTimeout: 50000, splitOn:"ID") 

我得到空的结果。

恕我直言,问题是在类属性上映射SQL列,因为如果将道具Card.CarId更改为Car.CAR_ID,则会填充此属性。

有什么办法如何将“SQL列”映射到SqlMapper.Query<T1,T2,TReturn>中的类属性到类属性?

我知道存在ClassMapper但我没有找到方法如何在这种情况下使用。

感谢

编辑:

我尝试添加映射类,但不能工作

public class CarMapper : ClassMapper<Car> 
{ 
    Table("CARS"); 
    Map(c=>c.CarId).Column("CAR_ID").KeyType(KeyType.Assigned); 
    Map(c=>c.CarLocation).Column("CAR_LOCATION"); 
    Map(c=>c.CarStatus).Column("CAR_STATUS"); 
} 

public class BrandMapper : ClassMapper<Brand> 
{ 
    Table("BRANDS"); 
    Map(c=>c.Id).Column("ID").KeyType(KeyType.Assigned); 
    Map(c=>c.CarId).Column("CAR_ID"); 
    Map(c=>c.BrandName).Column("BRAND_NAME"); 
    Map(c=>c.BrandLogo).Column("BRAND_LOGO"); 
} 

添加映射组件

DapperExtensions.DapperExtensions.SetMappingAssemblies(new List<Assembly> 
{ 
    Assembly.GetAssembly(typeof(CarMapper)), 
    Assembly.GetAssembly(typeof(BrandMapper)),               
}); 

这个设置完毕后执行查询

var data = connection.Query<Car, Brand, Car>(SQL_CMD, (car, brand) => 
    { 
     car.Brand = brand; 
     return car; 

    }, commandTimeout: 50000, splitOn:"ID") 

正如我告诉行不通不行对象的属性是空的,但如果我想简单的插入,更新或删除它的工作原理。

我很困惑现在哪里可以成为问题的根源。

回答

1

Dapper扩展提供了4个扩展:获取,插入,更新和删除,所以你的第二个例子不会工作。查询扩展是核心Dapper的一部分。据我所知,Dapper扩展不支持多映射。

我能想到的唯一的选择是修改你的SELECT语句,并重新命名的属性,例如:

SELECT CAR_ID as CarId, CAR_LOCATION as CarLocation, CAR_STATUS as CarStatus, etc. 
FROM CARS 
LEFT JOIN BRANDS 
ON CARS.CARD_ID = BRANDS.CARD.ID 

那么多映射应该工作。

另外,如果按ID拆分,则不需要指定splitOn。 Dapper会自动在Id字段上分割。

小巧玲珑假设您的ID列被命名为“ID”或“身份证”,如果你的主键不同,或者您想在宽行以比“ID”,使用可选的“splitOn”另一点拆分参数。