C# Dapper无法将数据传递到数据库
我遇到无法插入或更新数据库的问题。我使用Dapper和嵌套类来传递数据 我有一个错误是:C# Dapper无法将数据传递到数据库,c#,model-view-controller,dapper,C#,Model View Controller,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] p
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));
}
});
我的控制器如下:
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));
}
});
我的存储过程如下:
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));
}
});
我将数据从客户端传递到控制器,如下所示:
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将数据从嵌套类中分离出来,并将其分解为单个类,即使在应用程序级别中是嵌套类
或者有其他解决办法吗
非常感谢你的回答
谢谢我认为Dapper不支持嵌套对象作为参数 您可以尝试的是:
[表(“学生类”)]
公共部分班学生班
{
公立学生班()
{
StudentClassCelletus=新HashSet();
}
公共int Id{get;set;}
公共int Studentid{get;set;}
公共int Subjectclassid{get;set;}
[填写(错误)]
[计算]
公共虚拟学生学生{get;set;}
[填写(错误)]
[计算]
公共虚拟主题类主题类{get;set;}
[填写(错误)]
[计算]
公共虚拟ICollection学生课堂教学大纲{get;set;
}
及
[表格(“附表”)]
公共部分课程表
{
公共附表(
{
考勤=新哈希集();
}
公共int Id{get;set;}
公共int?讲师ID{get;set;}
public int?Subjectclassid{get;set;}
公共日期时间日期{get;set;}
公共时间跨度开始时间{get;set;}
公共时间跨度结束时间{get;set;}
public int?Roomstatus{get;set;}
公共字符串所有者JITSID{get;set;}
公共字符串生成器omName{get;set;}
[填写(错误)]
[计算]
公共虚拟讲师{get;set;}
[填写(错误)]
[计算]
公共虚拟主题类主题类{get;set;}
[填写(错误)]
[计算]
公共虚拟ICollection考勤{get;set;}
}
}
当我将这个标记“[Write(false)][Computed]”设置为model时。当dapper更新实体时,将传递该参数
public类成员映射器:DapperExtensions.Mapper.ClassMapper
{
公共成员映射器()
{
表格(“表格名称,如果与模型表格名称不同”);
Map(f=>f.MemberInfo).Ignore();
自动映射();
}
}
您好,您认为是因为Dapper没有这种支持,我应该上3级吗?其中2个类似于我上面的问题(使用嵌套类,这仅在尝试将数据从客户端传递到服务器端时可用),然后当想要转到DB时,我应该再创建一个完全不是嵌套类的类(如您的答案1)(该类的用途仅用于DB和Dapper之间的连接),以便DB能够理解它?对于2号,我不太理解,它的财产1和价值1意味着什么?这是嵌套类的吗?谢谢,一切都取决于你!在我看来,动态对象最适合,因为您将只在数据层级别使用此逻辑,并且您已经收到了包含所有必要信息的结构化对象。因此,每当您的成员类发生更改时,它都会在数据访问方法中生成一个错误,使其保持一致。嗨,还有一个我在使用动态对象时没有得到的错误。。属性和值如下:conn.Execute(“MemberInformation”,新的{Email:models.MemberInfo.Email,City:models.MemberInfo.City(等等)},commandType:commandType.storedProcess)代码>?非常感谢,将所有信息作为单个平面对象传递,而不嵌套属性。欢迎使用!如果您接受我的回答,这对其他开发人员来说将是一件好事,这样他们也可以将其用作解决方案。;)