2011-03-24 22 views
7

estoy tratando de crear una relación de muchos a muchos en Entity Framework (código primero), de acuerdo con el siguiente mensaje: Database design for limited number of choices in MVC and Entity Framework?Relación de muchos a muchos con tabla de unión en Entity Framework?

Sin embargo, no puedo conseguir que funcione correctamente, y estoy Seguro que estoy haciendo algo muy simple de la manera incorrecta. Aquí está el diagrama que no tengo de mis intentos:

enter image description here

La punta de la tabla de unión es que necesito tener una propiedad adicional, Nivel, en la relación, por lo que no puede ir sólo con una relación directa entre el Consultor y el Programa. Agregué la entidad ConsultantProgramLink de forma manual en el diseñador, y luego agregué asociaciones a Programa y Consultor respectivamente, seleccionando agregar un FK para cada uno, y luego los convertí en las dos claves principales. Pero cuando lo hago así, no funciona como esperaba:

Si hubiera hecho una asociación directa entre el Consultor y el Programa, habría podido referirme, por ejemplo, a los Programas de Consultor en mi código. Pero eso no funciona ahora con la tabla de unión. ¿Hay alguna forma de remediar esto, o siempre tengo que pasar por la propiedad de unión (Consultant.ConsultantProgramLink.Programs)? En cualquier caso, incluso si trato de pasar por la propiedad de unión, no ayuda. Puedo hacer Consultant.ConsultantProgramLink en mi código, pero otro punto no me da los Programas de propiedad de navegación (que por algún motivo también se convirtieron simplemente en Programa, ¿por qué? ¿Puedo cambiarles el nombre si eventualmente tengo acceso a ellos?) .

Entonces, ¿qué estoy haciendo mal? ¿Por qué no puedo acceder a las propiedades a través de la notación de puntos en mi código?

Respuesta

11

Una vez que modela una tabla de unión como una entidad, de hecho pierde la relación directa de muchos a muchos entre Consultant y Program. Así es como funciona. Tendrás una relación directa de varios a varios o propiedades adicionales en la tabla de unión. No ambos. Si quieres tanto puede intentar crear la costumbre Programs propiedad en Consultant y el uso consulta LINQ para obtener programas relacionados:

public IEnumerable<Program> Programs 
{ 
    get 
    { 
     return this.ConsultantProgramLinks.Select(l => l.Program); 
    } 
} 

El ejemplo es también la explicación de su último problema. No puede tener la propiedad Program en ConsultantProgramLink porque es una colección de entidades relacionadas, no entidad única (debe llamarse ConsultantProgramLinks). La propiedad en la entidad ConsultantProgramLink se llama simplemente Program porque representa la entidad única no la colección.

Editar:

Si necesita cada Program a asociarse automáticamente con cada Consultant debe cumplir cuando se va a crear una nueva Program. Tener tabla de unión expuesto como entidad separada, probablemente le permitirá lograr fácilmente:

var program = new Program(); 
... 
context.Programs.AddObject(program); 

var ids = from c in context.Consultants 
      select c.Id; 

foreach (var id in ids) 
{ 
    var link = new ConsultantProgramLink 
     { 
      ConsultantId = id, 
      Program = program 
     }; 
    context.ConsultantProgramLinks.AddObject(link); 
} 

context.SaveChanges(); 

Si se agrega nueva Consultant tendrá que crear enlaces a todos los programas de la misma manera.

La desventaja es que si tiene, por ejemplo, 1000 consultores, esta construcción creará 1001 inserciones de base de datos donde cada inserción se ejecutará en un viaje de ida y vuelta separado a la base de datos. Para evitarlo, la única opción es usar el procedimiento almacenado o desencadenar en la tabla de Programa.

+0

Ok, gracias, tiene sentido. Pero me pregunto si estoy pensando en todo esto mal?No puedo entender cómo hacer realmente lo que quiero con esto: – Anders

+0

Digamos que creo un nuevo Consultor. Quiero que ese consultor tenga todos los Programas en su propiedad Programas. Y luego quiero que el usuario pueda establecer el nivel de competencia para cada uno de estos. Pero 1: ¿cómo asigno todos los Programas en la tabla de Programas a cada Consultor? Y 2: ¿y si agrego nuevos Programas a la tabla de Programas (que deseo poder hacer)? ¿Ves lo que necesito? Una lista de programas como Adobe Illustrator, MS Word, etc., y esta lista debe ser extensible. Pero cada Consultor siempre debe "tener" todos los Programas en su propiedad Programas, y solo establecer el nivel en el perfil de edición ... – Anders

+0

Lo pensaré. –

Cuestiones relacionadas