如何在不显式指定主键的情况下使用 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" });
当我想将一个对象插入我的数据库时,我收到一个错误:
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" });