primary name framework foreign dataannotations data column attribute annotation entity-framework

entity-framework - name - key data annotation c#



Entity Framework 1 a 1 relación usando el código primero. ¿cómo? (2)

Tengo dos clases ¿Cómo puedo convertir estas dos clases en una relación uno a uno utilizando el primer método del código del marco de la entidad?

public class Region { public int RegionId { get; set; } public string Name { get; set; } public virtual Factory _factory { get; set; } } public class Factory { public int FactoryId { get; set; } public string Name { get; set; } public virtual Region _region { get; set; } }

Cuando intento esto, me sale este error: la multiplicidad no es válida en el Rol ''Region_Factory_Source'' en la relación ''Region_Factory''. Debido a que las propiedades del rol dependiente no son las propiedades clave, el límite superior de la multiplicidad del rol dependiente debe ser ''*''.


EF6, agregar atributos:

[Key] public int RegionId { get; set; } [Key, ForeignKey("Region")] public int FactoryId { get; set; }


Esto ocurre en CodeFirst debido a la palabra clave virtual. En efecto, está creando una relación donde la creación de un elemento requiere la creación del otro. sin embargo, la palabra clave virtual permite la creación de instancias perezosas, lo que significa que crear un objeto de un tipo no crea automáticamente el otro tipo, lo que permite que la identificación del elemento externo sea nula. Esto implica una relación 0..1, pero como cada lado es virtual, lo que obtienes es un 0..0 que no está permitido.

Hay 2 métodos que puede utilizar para remediar la situación.

  1. elimine la opción virtual de un lado o de ambos lados de las propiedades de navegación, permitiendo un mapa 0..1 o un mapa 1..1.
  2. agregue explícitamente una propiedad para la clave externa de la otra entidad en cada objeto. es decir, en la clase Region agregue una propiedad para FactoryId y en Factory agregue una propiedad para RegionId

Hay otras formas de ayudar a Entity Framework a determinar qué objeto es el Objeto dependiente, es decir, usar la API de Entity Framework Fluent.

de MSDN

Configuración de una relación donde se requieren ambos extremos (uno a uno)

En la mayoría de los casos, el Entity Framework puede inferir qué tipo es el dependiente y cuál es el principal en una relación. Sin embargo, cuando se requieren ambos extremos de la relación o ambos lados son opcionales, Entity Framework no puede identificar al dependiente y al principal. Cuando se requieren ambos extremos de la relación, use WithRequiredPrincipal o WithRequiredDependent después del método HasRequired. Cuando ambos extremos de la relación son opcionales, use WithOptionalPrincipal o WithOptionalDependent después del método HasOptional.

el siguiente código crearía una Factory principal con una Region dependiente

// Configure the primary key for the Region modelBuilder.Entity<Region>() .HasKey(t => t.RegionId); modelBuilder.Entity<Factory>() .HasRequired(t => t.Region) .WithRequiredPrincipal(t => t.Factory);