如何在不显式指定主键的情况下使用 Dapper Extensions 将对象插入 PostGreSql?

How to insert an object into PostGreSql using Dapper Extensions without specifying primary key explicitly?

当我想将一个对象插入我的数据库时,我收到一个错误:

object reference not set to an instance of an object

当对象的主键字段是 null 时。当我为该字段设置一些值时,它工作正常。

我的table创作:

create table Appointment
(
    AppointmentUUID uuid DEFAULT uuid_generate_v4 () primary key,
};

我的 class :

public class Appointment 
{
    public Guid? AppointmentUUID { get; set; }
    public void Insert(NpgsqlConnection conn)
    {
        var i = conn.Insert(this);            
    }
}

我的调用代码:

var lConnection = new NpgsqlConnection(connstring);
lConnection.Open();

var a = Appointment.Get2(allAppoints.FirstOrDefault().AppointmentUUID.Value, lConnection);
var newApp = new Appointment();
newApp.Insert(lConnection);

肯定有一种方法可以让我插入对象并让数据库创建它自己的对象 Guid。我错过了什么?

两个更正:

首先,您不需要使 AppointmentUUID 可为空。所以只需删除它:

public Guid AppointmentUUID { get; set; }

其次,您可能需要将AppointmentUUID映射为Key:

Map(x => x.AppointmentUUID).Key(KeyType.Guid);

这将告诉 Dapper Extensions 自行生成密钥 (Guid)。

Dapper Extensions 自带 default mappings,这是基于约定的开箱即用的。但是,显然,您必须稍微扩展它才能处理某些情况。映射简单,不需要映射每一列;只是特殊列。

另请注意,您的密钥 属性 以 "ID" 结尾,类型为 Guid。 Dapper Extensions 应该在没有映射的情况下自动将其视为 Key。以防万一您的模型中有其他 属性 也以 "ID" 结尾,这可能就是问题所在。就个人而言,我总是更喜欢显式映射;以防万一我以后添加一些东西;现有的东西不应该开始表现得很奇怪。

对于您的情况,映射可以像下面这样完成:

internal sealed class AppointmentMapper : ClassMapper<Appointment>
{
    public AppointmentMapper()
    {
        Table("Appointment");
        Map(x => x.AppointmentUUID).Key(KeyType.Guid);//<--Just map this
        AutoMap();//<-- This will take care about all other columns you do not map explicitly; ofcouse based on conversions
    }
}

然后,在项目启动时调用如下:

DapperExtensions.DapperExtensions.SetMappingAssemblies(new[] { "Your Assempby Here" });