2012-02-12 30 views
7

Al mirar las preguntas y respuestas en este sitio y leer algunos de los mejores tutoriales clasificados por Google en primer lugar el desarrollo Código frecuencia veo el siguiente patrón ...¿Cuál es el sentido de crear propiedades de clave externa cuando se usa primero el código de Entity Framework?

public class Category 
{ 
    public Category() 
    { 
     Products = new Collection<Product>(); 
    } 
    public Guid ID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
} 

public class Product 
{ 
    public Guid ID { get; set; } 
    public string Name { get; set; } 
    public DateTime DateAdded { get; set; } 
    public Guid CategoryID { get; set; } // Seemingly redundant property 
    public virtual Category Category { get; set; } 
} 

Durante la búsqueda de tutoriales Código Primero los dos siguientes páginas vienen que el uso de este mismo patrón:

http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

http://www.codeproject.com/Articles/327945/Architecture-Guide-ASP-NET-MVC3-Entity-Framework-C

Pregunta: Entonces, ¿qué sentido tiene tener la propiedad de clave foránea en el objeto Code First C#? En el ejemplo anterior puede omitir CategoryID de la clase Product y todo funcionará perfectamente. La clave externa Category_ID se seguirá creando en la base de datos.

Lo único que podía pensar es que las personas les gustaría ser capaz de especificar si la relación es opcional el uso de tipos anulables en lugar de la API fluida, pero creo que realmente confunde las cosas a tener tanto una propiedad Category y CategoryID .

Así que antes de ir y eliminar todas mis propiedades de clave foránea, ¿hay algo que me falta aquí? ¿De qué sirve hacer esto?

Gracias!

+0

Creo que lo que es un 'Guid' hace? una diferencia Se pueden aplicar algunas Anotaciones de datos. –

+0

Sí, lo mencioné en mi pregunta ... ¿algo que no se puede hacer usando la API fluida? Parece bastante malo tener dos propiedades esencialmente duplicadas cuando no es necesario. –

+0

Posible duplicado de [Código primero: asociaciones independientes vs. asociaciones de claves extranjeras?] (Https://stackoverflow.com/questions/5281974/code-first-independent-associations-vs-foreign-key-associations) –

Respuesta

8

Sí, creo que no hay necesidad de propiedades de clave externa y de alguna manera son un artefacto relacional en el mundo de los objetos. Puede definir relaciones completamente sin propiedades FK. En Fluent API puede definir si la relación es opcional o obligatoria y puede especificar el nombre de la columna de la clave externa de la tabla de la base de datos. La relación se llama entonces Asociación independiente.

Mi comprensión es que Asociaciones de claves foráneas - relaciones con las propiedades de claves externas expuestas en su clase de modelo - solo existe para hacer que trabajar con relaciones en Entity Framework sea más fácil y más cómodo en ciertos escenarios. Por ejemplo:

Supongamos que tiene una vista web para crear o editar un producto y la vista contiene un cuadro combinado para seleccionar una categoría y asignarla al producto. Para completar el cuadro combinado cuando se visualice la vista, cargará, por ejemplo, el ID y el Name de todas las categorías de la base de datos.

Cuando la página se publique nuevamente recibiría las propiedades del producto y el ID de la categoría seleccionada. Si usted no tiene una propiedad clave externa CategoryID en su Product que tendría que crear la relación de esta manera:

var category = new Category { ID = IDFromComboBox }; 
context.Categories.Attach(category); 
product.Category = category; 

Con una propiedad FK sólo necesita una línea:

product.CategoryID = IDFromComboBox; 

Clave externa las propiedades no existían en Entity Framework versión 1 (.NET 3.5) y se han introducido con EF versión 4 (.NET 4) para admitir mejor escenarios como el anterior.

Una visión crítica sobre la asociación de clave externa se puede encontrar y la diferencia entre los dos tipos de asociaciones está muy bien discutido en el blog de Ladislav:

http://www.ladislavmrnka.com/2011/05/foreign-key-vs-independent-associations-in-ef-4/

+0

Gracias por la respuesta en profundidad y referencia del blog. Sin embargo, tal vez me falta algo de su ejemplo ... Si llena un cuadro combinado con categorías de la base de datos y el formulario se publica con la identificación de la categoría seleccionada, ¿no intentaría extraer la categoría de la base de datos ('var category = db.Single (x => x.ID == id); '), realice la validación y luego asigne la categoría simplemente yendo' product.Category = category'? –

+0

@JohntheRevelator: Sí, esa es la alternativa. Pero requeriría una base de datos adicional de ida y vuelta. No necesitas este viaje de ida y vuelta si tienes el ID, para eso sirve 'Attach'. La validación es un buen punto, se refiere a la validación si existe la categoría con la ID publicada, ¿verdad? Todavía podría hacerlo con 'if (db.Categories.Any (x => x.ID == id)) ...' que simplemente devuelve un 'bool' y sería más barato que devolver la categoría completa. – Slauma

Cuestiones relacionadas