2010-01-24 9 views
5

Soy nuevo en Entity Framework y estoy tratando de resolver las cosas. Tengo una base de datos creada que no es muy complicada. Hay alrededor de 7 tablas y 3 de ellas son tablas de asignación para asociar un registro de tabla con otro. El ejemplo que estoy usando aquí es la siguiente:Usando Entity Framework, ¿cómo puedo reflejar una relación de muchos a muchos y agregar entidades que existen a una nueva entidad que se está creando?

  • tabla de usuarios

    • UserId
    • Nombre de usuario
  • Tabla papel

    • RoleId
    • NombreRol
  • Tabla: UserRole

    • UserId
    • RoleId

Las claves externas se asignan en mi base de datos. Cuando creo un nuevo Modelo de Entidad dentro de VS 2008, el diagrama parece tener las relaciones correctas, pero no crea una tabla para la tabla UserRole. La relación se mapea como muchos a muchos entre el rol de usuario &.

Mi problema es que puedo crear nuevos usuarios y puedo crear nuevos roles, pero no puedo encontrar la manera de crear un nuevo usuario con un rol existente. Además, la tabla UserRole probablemente no esté asignada correctamente dentro del modelo para empezar. Aquí está mi código hasta ahora:

ObjectQuery<Role> roles = context.Roles; 
Role role = context.Roles.Where(c => c.RoleName == "Subscriber").First(); 

User user = new User 
{ 
    DisplayName = "TestCreate2", 
    Email = "[email protected]", 
    Password = "test" 
};    
context.AttachTo("Roles", role); 
user.Roles.Add(role);    
context.AddToUsers(user); 
context.SaveChanges(); 

aquí es el error que estoy recibiendo:

No se puede actualizar 'UserRoles' la EntitySet porque tiene un DefiningQuery y no existe ningún elemento en el elemento para soportar la corriente operación.

Aquí es el XML que se refiere a la tabla UserRole:

<EntitySet Name="UserRoles" EntityType="RememberTheJourneyModel.Store.UserRoles" store:Type="Tables" store:Schema="dbo" store:Name="UserRoles"> 
     <DefiningQuery>SELECT 
    [UserRoles].[Role_id] AS [Role_id], 
    [UserRoles].[User_id] AS [User_id] 
    FROM [dbo].[UserRoles] AS [UserRoles]</DefiningQuery> 
     </EntitySet> 

Fue tirar los dientes sólo para averiguar cómo consultar el contexto de tal manera que me dio una entidad papel real. Estoy seguro de que el problema tiene que ver con cómo se mapea UserRole, pero recién estoy comenzando aquí y no tengo ni idea de dónde podría haber salido mal.

Y realmente he buscado en google & este sitio, pero supongo que no he encontrado los parámetros de búsqueda adecuados para encontrar una pregunta que me ayude a solucionarlo. Encontré una pregunta que decía que EF tiene problemas con esto, pero si la tabla de asignación hace que ambas columnas sean una clave principal, se resuelve solo. No estoy seguro de cómo hacer eso. ¿Se hace esto en la base de datos (usando SQL SERVER 2005 EXPRESS) o en la asignación? Este es un proyecto personal, así que puedo publicar más detalles sobre el código o xml si es necesario. Cualquier y toda ayuda será apreciada.

Respuesta

4

Recuerdo haber tenido este problema también antes ... y creo que lo solucioné al hacer que ambas teclas de columnas aparezcan en mi tabla de asociación.

Puede hacer que ambas columnas sean la clave principal en el diseñador de tablas de SQL Server Management Studio. Simplemente resalte User_Id e Role_Id al mismo tiempo, haga clic con el botón derecho en la izquierda y seleccione Primary Key ... esto hará que ningún registro tenga la misma combinación de User_Id y Role_Id .. haciendo que cada entrada sea única.

Luego puede actualizar su modelo de datos en el diseñador de Entity Framework .. y espero que esté listo.

Creo que si una tabla no tiene ninguna clave definida para garantizar que los registros sean únicos, entonces EF no podrá actualizar los registros correctamente, por lo que el framework protege contra ese caso.

+2

¡Eso fue todo! Simplemente no sabía cómo asignar 2 claves principales. Resaltando las dos filas trabajadas. ¡Gracias! – jason

+0

No hay problema, me alegro de poder ayudar. – markt

Cuestiones relacionadas