2017-08-23 1 views
0

Je rencontre un problème lorsque je ne peux pas insérer ou mettre à jour la base de données. J'utilise Dapper et j'utilise la classe imbriquée pour le modèle sur lequel je veux transmettre les données.Dapper ne peut pas transmettre les données à la base de données

J'ai une erreur qui est:

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

Mon modèle est ci-dessous:

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; } 
} 

Et mon contrôleur est ci-dessous:

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(); 
} 

Ma procédure stockée est ci-dessous:

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 

Et je passe les données au contrôleur du côté client est ci-dessous:

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)); 
       } 
      }); 

Mais si je ne l'ai pas dans la classe imbriquée (signifie toutes les données de la classe d'information déplacés à la classe des membres), Tout fonctionne bien.

Comment puis-je demander à dapper de séparer les données de la classe imbriquée et de les diviser en une seule classe, même si la classe imbriquée est au niveau de l'application.

Ou existe-t-il d'autres solutions pour cela?

Votre réponse a été très appréciée.

Merci

Répondre

0

Eh bien, je ne pense pas que Dapper a ce genre de support pour les objets imbriqués en tant que paramètres.

Ce que vous pouvez essayer:

  1. Créer une DTO exactement comme votre procédure stockée et attend mapper votre objet membre à ce nouveau type.
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; } 
} 
  1. Ou tout simplement passer les arguments comme un objet dynamique avec la syntaxe:

    conn.Execute ("MemberInformation", nouveau {Propriété1: value1, Property2: value2}, commandType: CommandType.StoredProcedure);

+0

Salut, alors pensez-vous que c'est parce que le Dapper n'avait pas ce genre de support, je devrais faire 3 classes? 2 d'entre eux est comme ma question ci-dessus (avec la classe imbriquée, et c'est seulement utilisable en essayant de passer les données du client au côté serveur), et puis quand je veux aller à la DB, je devrais faire 1 classe de plus (comme votre réponse n ° 1) qui n'est pas du tout une classe imbriquée (ce but de classe est uniquement pour la connexion entre DB et Dapper), de sorte que la DB puisse le comprendre? Pour le n ° 2, je ne comprends pas très bien, qu'est-ce que ça veut dire par property1 et value1? est-ce de la classe imbriquée? Merci – Natsuki

+0

Eh bien, tout dépend de vous! À mon avis, l'objet dynamique convient le mieux, car vous n'utiliserez cette logique qu'au niveau de la couche de données et vous recevez déjà votre objet structuré qui contient toutes les informations nécessaires. Donc, à chaque fois que votre classe membre change, cela génère une erreur dans la méthode d'accès aux données, ce qui la rend cohérente. –

+0

Salut, un de plus que je n'ai pas eu lors de l'utilisation de l'objet dynamique .. est la propriété et la valeur sera comme suit: 'conn.Execute (" MemberInformation ", nouveau {Email: models.MemberInfo.Email, Ville: models.MemberInfo.City (et ainsi de suite)}, commandType: CommandType.StoredProcedure); '? Merci – Natsuki