在Dapper中有一种将属性映射到自定义类型的方法吗?

3

我们正在考虑使用Dapper来简化我们的映射逻辑。它看起来非常有前途,除了一个问题。我们使用自定义类型作为我们的id。例如:

public class MyEntityIdentity 
{
    public int IdentityValue { get; }
    public MyEntityIdentity(int identity) { IdentityValue = identity; }
}

public class MyEntity
{
    public MyEntityIdentity Identity { get; set; }
    int Prop1 { get; set; }
    string Prop2 { get; set; }
    bool Prop3 { get; set; }
}

SQL表格大致如下:

create table [dbo].[MyEntity] (
    my_entity_id int identity(1,1) NOT NULL,
    prop1 int NULL,
    prop2 varchar(100) NULL,
    prop3 bit NOT NULL

    CONSTRAINT PK_MyEntity PRIMARY KEY CLUSTERED (my_entity_id ASC)
)

我们如何映射“Identity”属性?

您的 my_entity_id 仍然是一个 int,因此您应该将其直接映射为 int。 - Benjamin Soulier
拥有该实体的目的是什么?你的ID是一个int。在我看来,你为了微不足道的收益而使你的模型过于复杂化了。 - user47589
Amy,我们为身份创建了一个接口,使它们能够与复杂的遗留存储库模型配合使用。这些遗留身份本身可能非常复杂。我正在为新开发创建简单的实体和身份,但它们仍然必须能够在遗留系统内运行。 - afeygin
1个回答

3
您可以使用自定义类型处理程序,如下所示:
public class IdentityHandler : SqlMapper.TypeHandler<MyEntityIdentity>
{
    public override MyEntityIdentity Parse(object value)
    {
        return new MyEntityIdentity((int)value);
    }

    public override void SetValue(IDbDataParameter parameter, MyEntityIdentity value)
    {
        parameter.Value = value.IdentityValue;
    }
}

并像这样注册它:

SqlMapper.AddTypeHandler(new IdentityHandler());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接