¿Por qué estoy recibiendo una ejecución de tiempo de ejecución al devolver la dinámica?
Pregunta
Estoy usando masivo y tengo una mesa para miembros. En mi clase de miembros tengo un método de búsqueda para encontrar un miembro por correo electrónico:
public class Members : DynamicModel
{
public Members(): base("TSConnection", "Members", "Id"){}
public dynamic Find(string email)
{
dynamic result = new ExpandoObject();
result.Success = false;
try
{
result.Member = this.Single(where: "Email=@0", args: email);
result.Success = result.Member != null;
}
catch (Exception ex)
{
result.Message = ex.Message;
}
return result;
}
}
Esto devuelve todo como se esperaba y en una prueba de prueba unitaria separada que result.Member.Id
muestra que está poblado con los datos.
En una clase separada, direcciones. Intento usar este método para verificar que el usuario existe y recuperar el miembro.id para usar al insertar una dirección para el miembro en particular:
public class Addresses : DynamicModel
{
public Addresses() : base("TS", "Addresses", "Id") { }
public dynamic Create(string email, string type, string address1, string address2, string city, string state, int countryId, string postcode)
{
var members = new Members();
dynamic result = new ExpandoObject();
result.Success = false;
//var member = members.Find(email);
result.Member = members.Single(where: "Email=@0", args: email);
dynamic address = new ExpandoObject();
if (result.Member != null)
{
address.Id = this.Insert(new {
MemberId = result.Member.Id,
AddressTypeId = (int)AddressType.Account,
Address1 = address1,
Address2 = address2,
City = city,
State = state,
Country = countryId,
Postcode = postcode
});
result.Address = address.Id != 0 ? address : null;
result.Success = address.Id != 0;
}
return result;
}
}
En la línea de tabulación que lee var member = members.Find(email);
Esto está devolviendo una ejecución de tiempo de ejecución cuando intento acceder member.Member.Id
. Entro en el código y el método Buscar está 'devolviendo' los datos correctos, pero no se está pasando al miembro variable. Curiosamente cuando uso el código para recuperar al usuario en la línea a continuación:
result.Member = members.Single(where: "Email=@0", args: email);
Funciona bien. Sin embargo, no es realmente bueno para mantener las cosas secas. ¿Qué está pasando y hay alguna forma de usar el método Find de mi clase de miembros dentro de mi clase de direcciones?
Lloyd
Solución
Es porque estás regresando result
, de Find
, que es un ExpandoObject
. Para acceder al Member
en Addresses
Debe cambiar el código a:
var members = new Members();
var result = members.Find(email);
var member = result.Member;