2017-08-23 50 views
0

我遇到了无法插入或更新到数据库的问题。我正在使用Dapper并使用嵌套类作为我想要传递数据的模型。Dapper无法将数据传递到数据库

我有一个错误是:低于

The member Information of type TestProject.Models.Information cannot be used as a parameter value 

我的模式是:

public class Member 
{ 
    [Required] 
    public string Username { get; set; } 
    [Required] 
    public string Password { get; set; } 
    [Required] 
    public string Information MemberInfo { get; set; } 
} 

public class Information 
{ 
    [Required] 
    public string Email { get; set; } 
    [Required] 
    public string City { get; set; } 
    [Required] 
    public string State { get; set; } 
    [Required] 
    public DateTime BirthDate { get; set; } 
} 

而且我的控制之下是:

public IHttpActionResult SetMemberInfo(Member models) 
{ 
    using (TransactionScope trans = new TransactionScope()) 
    using (IDbConnection conn = new SqlConnection(GetConnection())) 
    { 
     conn.Open(); 

     int rowsAffected = conn.Execute("MemberInformation", models, commandType: CommandType.StoredProcedure); 

     trans.Complete(); 

     return rowsAffected; 
    } 

    return Ok(); 
} 

我的存储过程如下:

ALTER PROCEDURE dbo.[MemberInformation] 
(
    @Username NVARCHAR(100), 
    @Password NVARCHAR(100), 
    @Email  NVARCHAR(100), 
    @City  NVARCHAR(100), 
    @State  NVARCHAR(100), 
    @BirthDate DATETIME 
) 
AS 
BEGIN 
// TODO: Do something with the data 
END 

而且我通过数据从客户端控制器低于:

var models = { 
    "Username": "MyUsername", 
    "Password": "MyPassword", 
    "MemberInfo": { 
     "Email": "MyEmail", 
     "City": "MyCity", 
     "State": "MyState", 
     "BirthDate": "2017-08-23" 
    } 
}; 

$.ajax({ 
       type: "POST", 
       contentType: "application/json", 
       url: "http://localhost/SetMemberInfo", 
       data: JSON.stringify(models), 
       dataType: "json", 
       success: function (data) { 
        window.location.reload(); 
       }, 
       error: function (response) { 
        console.log(JSON.stringify(response)); 
       } 
      }); 

但是,如果我没能到嵌套类(指在信息类中的所有数据移动到成员类),一切正常。

如何告诉dapper将嵌套类中的数据分开,并将其拆分为单个类,即使在应用程序级别是嵌套类。

或者有没有其他解决方案呢?

您的回答非常感谢。

感谢

回答

0

嗯,我不认为小巧玲珑有这种嵌套对象作为参数的支持。

什么你可以尝试是:

  1. 创建一个DTO正是因为你的存储过程需要和你的会员对象映射到这个新的类型。
public class MemberInformationParameter 
{ 
    public MemberInformationParameter(Member member) 
    { 
      Username = member.Username; 
      Password = member.Password; 
      Email = member.MemberInfo.Email; 
      City = member.MemberInfo.City; 
      State = member.MemberInfo.State; 
      BirthDate = member.MemberInfo.BirthDate; 
    } 

    public string Username { get; set; } 
    public string Password { get; set; } 
    public string Email { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public DateTime BirthDate { get; set; } 
} 
  • 或者只是传递参数与语法的动态对象:

    conn.Execute( “MemberInformation”,新的{Property1: value1,Property2:value2},commandType:CommandType.StoredProcedure);

  • +0

    嗨,你认为是因为Dapper没有这种支持,我应该做3个类?其中2个就像我上面的问题(使用嵌套类,并且这只在尝试将数据从客户端传递到服务器端时可用),然后当想要访问数据库时,我应该创建1个类(如你的答案否1)根本不是嵌套类(这个类的目的仅仅是为了DB和Dapper之间的连接),这样DB就可以理解它了?对于2号,我不太明白,它是什么意思property1和value1?是来自嵌套类吗?谢谢 – Natsuki

    +0

    那么,完全取决于你!在我看来,动态对象最合适,因为您只会在数据层级使用此逻辑,并且您已经接收到包含所有必要信息的结构化对象。因此,每当您的成员类发生更改时,它都会在数据访问方法中产生错误,使其一致。 –

    +0

    嗨,还有一个我没有得到使用动态对象..是属性和值将如下所示:'conn.Execute(“MemberInformation”,新{电子邮件:models.MemberInfo.Email,城市: models.MemberInfo.City(等等)},commandType:CommandType.StoredProcedure);'?谢谢 – Natsuki