2016-09-20 5 views
2

У меня есть две таблицы: пользователя и UserType:Как отобразить данные из базы данных с Griffin-Framework Data-Mapper

CREATE TABLE [dbo].[User](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](50) NULL, 
    [UserTypeId] [int] NOT NULL 
) 
CREATE TABLE [dbo].[UserType](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](50) NULL 
) 

Мои классы модели:

public class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public UserType UserType { get; set; } 
} 
public class UserType 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Мой запрос:

SELECT 
    U.Id 
    , U.Name 
    , UT.Id AS [UserTypeId] 
    , UT.Name AS [UserTypeName] 
FROM dbo.User AS F 
    INNER JOIN dbo.UserType AS UT ON U.UserTypeId = UT.Id 
ORDER BY U.Id 

И мой класс сопоставления:

public class UserMapper : CrudEntityMapper<User> 
{ 
    public UserMapper() : base("User") 
    { 
     Property(x => x.UserType) 
      .ColumnName("UserTypeId") 
      .ToPropertyValue((x) => new UserType { Id = (int)x }); 
     Property(x => x.UserType) 
      .ColumnName("UserTypeName") 
      .ToPropertyValue((x) => new UserType { Name = (string)x }); 
    } 
} 

Когда я пытаюсь выполнить команду, я получаю список пользователей без userType.Id (Id always = 0). Мне нужно заполнить данными мои User и дочерние классы UserType.

Пожалуйста, покажите мне, что я делаю неправильно.

cmd.ToList<User>(); 

PS. im с использованием Griffin.Framework для картирования

ответ

0

Я не знаком с Гриффином как таковым, но ясно, что проблема заключается в том, что у вас есть два отдельных сопоставления для UserType. Каждое сопоставление создает новый объект, который перезаписывает член UserType на ваш объект User. В зависимости от того, какой столбец сначала отображается, вы всегда получите объект UserType, который имеет только один набор свойств.

Рассматривая источник для FluentPropertyMapping, не представляется возможным отображать несколько столбцов до одного. Потенциальный обходной путь, который зависит от поддержки для отображения вложенных свойств:

public class User 
{ 
    public User() 
    { 
     UserType = new UserType(); 
    } 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public UserType UserType { get; set; } 
} 

и в вашем отображении:

public class UserMapper : CrudEntityMapper<User> 
{ 
    public UserMapper() : base("User") 
    { 
     Property(x => x.UserType.Id) 
      .ColumnName("UserTypeId"); 
     Property(x => x.UserType.Name) 
      .ColumnName("UserTypeName"); 
    } 
}