2012-08-22 11 views
5

Tengo algunas clases de dominio que se parecen a esto, que quiero modelar con Code First (en EF 4.3).¿Por qué las clases de Code First necesitan propiedades de navegación?

public class Foo { 
    // ... 
} 

public class Bar { 
    // ... 

    public Foo Foo { get; set; } 
} 

public class Baz { 
    // ... 

    public Foo Foo { get; set; } 
} 

En cada example veo sin embargo, se añaden las referencias de objeto extraño en la clase Foo. ¿Puede mi clase Foo ser independiente de la clase Bar y Baz, o realmente necesito hacer algo como esto?

public class Foo { 
    // ... 
    public virtual Bar { get; set; } 

    public virtual Baz { get; set; } 
} 

Según this answer, clases hacer necesidad de tener propiedades de navegación. Soy nuevo en Code First, así que ¿alguien puede explicar por qué este podría ser el caso? ¿Hay alguna forma de evitar la contaminación de mi clase Foo de esta manera mediante el uso de la API Fluent?

Me parece raro que Foo necesite saber sobre cada clase que lo usa. ¿Mi diseño simplemente tiene defectos fundamentales de alguna manera?

Respuesta

1

La otra respuesta es parcialmente correcta.

Si desea que el sistema de arranque arranque su modelo de base de datos con relaciones entre las tablas, tendrá que definir al menos en una clase una propiedad de navegación.

La asignación, por supuesto, también funcionará sin la relación, pero no tendrá las limitaciones en el nivel de base de datos/sql. A menos que los agregue con migraciones u otras scripts sql.

Aunque en su ejemplo no estoy muy seguro de qué tipo de relación está tratando de definir de todos modos. ¿Se supone que es una relación uno a uno?

En ese caso, Foo no necesita saber acerca de ninguna otra clase que tenga una referencia, como se responde en su pregunta vinculada, solo una clase debe tenerlo.

+0

Gracias, esto aclaró mi malentendido. He malinterpretado apresuradamente la otra respuesta diciendo que 'Foo' debería tener la propiedad de navegación. – Eric

2

Su problema aquí será un requisito para la relación uno-a-uno. La relación uno-a-uno en EF se mapea a través de claves primarias. Usted elige la entidad principal y la entidad dependiente debe tener FK en su PK; deben tener el mismo valor de PK para relacionar. El motivo es la falta de soporte para claves únicas.

Una vez que acepte esta limitación puede simplemente usar su modelo y asignarla como:

modelBuilder.Entity<Bar>() 
      .HasRequired(b => b.Foo) 
      .WithOptional(); 

modelBuilder.Entity<Baz>() 
      .HasRequired(b => b.Foo) 
      .WithOptional(); 
+0

Esto es muy útil, gracias. – Eric

Cuestiones relacionadas