Ian*_*vis 8 c# primary-key dapper dapper-extensions
我有一个表有一个由两列组成的主键,这两列都没有自动递增,我的Dapper插入(Dapper Extensions的一部分)在插件上失败,说两列中的第一列不允许为null ,即使我传入的值也不是空的.
表Student:
StudentId (PK, not null) \_ (combined to form primary key)
StudentName (PK, not null) /
Active -- just another column
Run Code Online (Sandbox Code Playgroud)
C#:
public class Student {
public int StudentId { get; set; }
public string StudentName { get; set; }
public bool Active { get; set; }
}
var newStudent = new Student { StudentId = 5, StudentName = "Joe", Active = true };
var insertSuccess = myConn.Insert<Student>(newStudent);
Run Code Online (Sandbox Code Playgroud)
错误:
无法将值NULL插入列'StudentId',表'dbo.Student'; 列不允许空值.INSERT失败.
Dapper由于某种原因没有获得StudentId值为5.我是否必须为具有组合PK的表或具有不自动递增的PK的表执行特殊操作?谢谢.
Tha*_*had 12
添加AutoClassMapper将更改所有类的行为.如果您希望只处理这一个类,您可以为此类创建一个Map.
public class StudentClassMapper : ClassMapper<Student>
{
public StudentClassMapper()
{
Map(x => x.StudentId).Key(KeyType.Assigned);
Map(x => x.StudentName).Key(KeyType.Assigned);
AutoMap(); // <-- Maps the unmapped columns
}
}
Run Code Online (Sandbox Code Playgroud)
Dapper.Contrib 提供了一个注释来解决这个问题。
public class Student {
[ExplicitKey]
public int StudentId { get; set; }
[ExplicitKey]
public string StudentName { get; set; }
public bool Active { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
ExplicitKey 表示它是一个关键字段,您必须指定其值;它不是由数据库自动生成的。
我假设当您说“Dapper Extensions”时,您指的是不同的扩展库。您可能会发现可以轻松切换到 Dapper.Contrib。
我不确定这就是问题所在,但 AFAIK Dapper Extensions 默认情况下不支持复合主键。
您可能必须编写自己的AutoClassMapper:https://github.com/tmsmith/Dapper-Extensions/wiki/AutoClassMapper
默认的 AutoClassMapper 对您的数据库架构和 POCO 做出某些假设:
| 归档时间: |
|
| 查看次数: |
8857 次 |
| 最近记录: |