Dapper插入具有复合PK的表中

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)

  • 将其添加到文档https://github.com/tmsmith/Dapper-Extensions/wiki/Customized-mapping-for-a-class (2认同)

Cha*_*ins 8

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。

  • 虽然这有效,但我必须指出 `Get`、`GetAsync`、`GetAll` 和 `GetAll` 不支持组合键。 (3认同)

the*_*000 0

我不确定这就是问题所在,但 AFAIK Dapper Extensions 默认情况下不支持复合主键。

您可能必须编写自己的AutoClassMapperhttps://github.com/tmsmith/Dapper-Extensions/wiki/AutoClassMapper

默认的 AutoClassMapper 对您的数据库架构和 POCO 做出某些假设:

  • AutoClassMapper 假定您的表名称是单数(例如:Car 表名称和 Car POCO 名称)。
  • 每个 POCO 至少有一个名为 Id 或以 Id 结尾的属性。
  • 如果多个属性以 Id 结尾,Dapper Extensions 将使用第一个 Id 属性作为主键。
  • 如果 Id 属性确定为 Integer,则 KeyType 将设置为 Identity。
  • 如果 Id 属性被确定为 Guid,则 KeyType 将设置为 Guid。
  • 如果 id 属性不是 Integer 我们的 Guid,则 KeyType 将设置为已分配。