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

  • 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.-


    martes, 19 de abril de 2011 4:11

Respuestas