Principales respuestas
Mapear relación empleando EF Code First (Relacionar dos columnas a través de la misma clave foránea)

Pregunta
-
Buenas! ¿Cómo están? Quisiera saber si alguien podría decirme si es posible mapear relaciones con roles empleando EF Code First.Por ejemplo, si existe una entidad "Producto", que a su vez posee dos atributos llamados "SubParteA" y "SubParteB". Cada subparte está asociada a un Material a través de una clave foránea. Al declarar mis entidades en el modelo queda de la siguiente forma:
public class Producto { public int ProductoId { get; set; } public string SubParteA { get; set; } public string SubParteB { get; set; } public int MaterialSubParteAId { get; set; } public int MaterialSubParteAId { get; set; } public Material MaterialSubParteA { get; set; } public Material MaterialSubParteB { get; set; } } public class Material { public int MaterialId { get; set; } public string DescripcionMaterial { get; set; } }
El problema es que al recuperar los Productos desde el controlador dispara un error:El código de usuario no controló System.Data.EntityCommandExecutionException Message=An error occurred while executing the command definition. See the inner exception for details. Source=System.Data.Entity StackTrace: at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) at System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues) at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Data.Entity.Internal.Linq.InternalQuery`1.GetEnumerator() at System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.Generic.IEnumerable<TResult>.GetEnumerator() at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) at MvcPrueba.Controllers.ProductosController.Index() in C:\Users\Laura\Desktop\MvcPrueba\MvcPrueba\Controllers\ProductosController.cs:line 89 at lambda_method(Closure , ControllerBase , Object[] ) at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) InnerException: System.Data.SqlClient.SqlException Message=El nombre de columna 'MaterialMaterialId' no es válido. El nombre de columna 'MaterialMaterialId1' no es válido. Source=.Net SqlClient Data Provider ErrorCode=-2146232060 Class=16 LineNumber=14 Number=207 Procedure="" Server=\\.\pipe\ED4CA4E7-1C01-41\tsql\query State=1 StackTrace: at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlDataReader.ConsumeMetaData() at System.Data.SqlClient.SqlDataReader.get_MetaData() at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) InnerException: {"El nombre de columna 'MaterialMaterialId' no es válido.\r\nEl nombre de columna 'MaterialMaterialId1' no es válido."}
¿Cuál sería la forma correcta de mapear este tipo de ralación para evitar el este error?Desde ya gracias por su tiempo, saludos!Laura.-
- Editado Laura Ibarra Molas martes, 19 de abril de 2011 21:38
Respuestas
-
Hola verifica este link allí encontrarás como es posible definir relaciones mediante este tool!
Saludos
Custom Control Silverlight
"Blog Ingphillip's Prog: TODO WEB
New Post System.Reflection- Marcado como respuesta Eder Costa miércoles, 10 de octubre de 2012 12:26