Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Dapper无法将数据传递到数据库_C#_Model View Controller_Dapper - Fatal编程技术网

C# 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

我遇到无法插入或更新数据库的问题。我使用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));
                }
            });
我的控制器如下:

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不支持嵌套对象作为参数

您可以尝试的是:

  • 完全按照存储过程的预期创建DTO,并将成员对象映射到此新类型
  • 或者只需使用以下语法将参数作为动态对象传递:

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

  • [表(“学生类”)]
    公共部分班学生班
    {
    公立学生班()
    {
    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更新实体时,将传递该参数

  • 添加DapperExtensions的包
  • Dapper Extensions有一个名为insert或update的函数,可以接受类似于模型的成员对象
  • 自动映射();将映射所有其他属性,只要字段的名称相同
  • 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)?非常感谢,将所有信息作为单个平面对象传递,而不嵌套属性。欢迎使用!如果您接受我的回答,这对其他开发人员来说将是一件好事,这样他们也可以将其用作解决方案。;)