【问题标题】:using dapper to insert with stored procedure ( maybe tvp )使用 dapper 插入存储过程(可能是 tvp)
【发布时间】:2016-01-21 13:50:02
【问题描述】:

我有一个像这样的模型 PersonalInfo:

public string FirstName { get; set;}
public string LastName { get; set;}
public string Email { get; set; }
public IEnumerable<Addresses> Addresses{ get; set; }

我的地址模型包括如下内容:

public int AddressId { get; set; }
public string StreedAddress { get; set; }
public string State { get; set; }

我需要使用存储过程将这些插入数据库,但我需要使用 dapper 来执行此操作..对不起,我是新人..我尝试了以下类似的方法,但它不起作用:

  var Id =  connection.Execute("usp_Insert", personalInfo, commandType: CommandType.StoredProcedure);
    foreach (Addresses address in personalInfo.Addresses){
        connection.Execute("Insert", new {address, Id}, null, commandType: CommandType.StoredProcedure);
        };

我可能在这里做错了很多事情,我可以使用表值参数,但我不知道它如何与 dapper 一起使用。

更新:

所以我想如果我不想在第一个中传递地址,我可以将其排除在第一个发送之外吗?我仍然想一次传递整个模型而不是一个道具。

谢谢

【问题讨论】:

  • 什么不起作用?在第二次调用中插入是存储过程吗?
  • 另外,需要null参数吗?
  • 它说:无法将值 NULL 插入列 ID ..
  • @Simon yes 在 usp_insert 和 Insert 中都是存储过程。
  • @Simon 现在它说“不存在从对象类型地址 .Data.Models.Addresses 到已知托管提供程序本机类型的映射。

标签: dapper dapper-fluentmap


【解决方案1】:

问题在于 dapper 无法通过存储过程判断需要哪些参数。有数据库 API 可以查询,但一直这样做的成本非常高。对于常规查询,它可以很好地理解需要什么,但对于存储过程:它们是谜。因此,dapper 只是尝试包含它可以看到的所有内容。

您最好的选择是选择参数所需的属性的“新”投影。

【讨论】:

  • 是的,你会如何处理上面代码中的地址,因为它是一个枚举?
  • @Novice 我只会选择我想要的属性。所以在父级可能new { pi.FirstName, pi.LastName, pi.Email },在子级new { addr.AddressId, addr.StreetAddress, addr.State }。嗯,格式化效果不好……
  • 格式化肯定有问题。我可以使用 TVP,而不是遍历地址,如果可以的话,你会怎么做?
  • @Novice 是的,但是您现在需要填充一个 DataTable 来执行此操作。这可行吗?
猜你喜欢
  • 2022-07-29
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多