1

我的问题:使用此扩展时,它只会将数据库中的 ID 值映射到类对象。

所以我很好奇如何让它映射其他值?

C# 映射器

 public class SoftwareReleaseTypeHandle : SqlMapper.TypeHandler<SoftwareRelease>
    {
        public override SoftwareRelease Parse(object value)
        {
            if (value == null || value is DBNull)
            {
                return null;
            }

            SoftwareRelease rel = new SoftwareRelease();
            rel.ID = (Guid)value;

            return rel;
        }

        public override void SetValue(IDbDataParameter parameter, SoftwareRelease value)
        {
            parameter.DbType = DbType.Guid;
            parameter.Value = value.ID.ToString();
        }
    }

SQL 表如下所示:

CREATE TABLE [dbo].[SoftwareRelease](
    [ID] [uniqueidentifier] NOT NULL,
    [Type] [tinyint] NOT NULL,
    [ReleaseType] [tinyint] NOT NULL,
    [Version] [nchar](30) NOT NULL,
    [ZipFile] [varbinary](max) NOT NULL,
    [Date] [datetime] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

我使用这个映射器的原因是在我的代码中的其他地方我可以做,它会自动被映射:

class MyInstallation
{
 public string Bla;
 public string BlaBla;
 SoftwareRelease MyInstallation;
}

然后当我使用 Dapper 从看起来像的表中获取时。

CREATE TABLE [dbo].[MyInstallation](
        [ID] [uniqueidentifier] NOT NULL,
        [Bl] [nchar](30) NOT NULL,
        [BlaBla] [nchar](30) NOT NULL,
        [MyInstallation] [uniqueidentifier] NOT NULL,
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
4

1 回答 1

2

Dapper 类型处理程序旨在将数据库中的单个列值映射到 POCO 中的单个成员。它们用于 Dapper 的核心不理解的类型——通常是任何不是 .NET 核心类型的类型。

您没有确切说明您需要做什么,但如果您只是想SoftwareRelease从数据库中读取行,那么您可以简单地执行以下操作:

myDb.Query<SoftwareRelease>("SELECT * FROM SoftwareRelease");

更新

听起来你真正想要的是multi-mapping。如果您有以下查询:

SELECT a.Bla, a.BlaBla, b.*
FROM MyInstallation a
INNER JOIN SoftwareRelease b ON a.SoftwareReleaseId = b.ID

然后您可以使用以下内容来填充对象:

myDB.Query<MyInstallation, SoftwareRelease, MyInstallation>(
    sql, 
    (installation, softwareRelease) => {
        installation.SoftwareRelease = softwareRelease;
    });
于 2015-08-25T11:49:30.643 回答