3

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

你调用的对象是空的

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

我的表创建:

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

我的课 :

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. 我错过了什么?

4

1 回答 1

2

两个更正:

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

public Guid AppointmentUUID { get; set; }

其次,您可能需要映射AppointmentUUIDas Key

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

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

Dapper Extensions 带有基于约定的开箱即用的默认映射。但是,显然,您必须稍微扩展它以处理某些情况。映射很简单,不需要对每一列进行映射;只是特殊的列。

另请注意,您的关键属性以“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" });
于 2019-07-24T14:05:35.187 回答