visual tutorial studio mvc framework first español c# entity-framework-6

c# - tutorial - entity framework visual studio 2017



Entity Framework 6 relación unidireccional opcional (3)

Lo siento, no es posible. La relación de Valide en EF debe ser también válida en la base de datos, en otras palabras, la tabla dependiente debe estar refiriendo un identificador único en la tabla principal. De lo contrario, el sistema no puede garantizar que haya como máximo un cliente por departamento.

Tengo dos mesas:

Client ------------------------ Id (string) <-- PrimaryKey Name (string) Number (int) Department:* ------------------------ Id (int) <-- Primary key Name (string) ClientNumber (int?) Client (Client, virtual) .....

Ahora quiero crear una relación opcional de Departmant a Client (usando ClientNumber). Creé una propiedad virtual en la clase Departamento (Cliente) y ahora necesito configurar la relación utilizando EntityTypeConfiguration.

No hay claves externas configuradas en la base de datos y no puedo cambiar la base de datos. Tampoco puedo cambiar el Cliente de la Entidad (clase).

Por lo tanto, debo informar a EntityFramework que ClientNumber en la clase Department está relacionado (opcionalmente) con la propiedad Number en la clase Client.

Pero no puedo entender cómo decirle a EF que ClientNumber del Departamento está relacionado con la propiedad Number del Cliente, no con la clave principal del Cliente. (sin cambiar la clase de entidad Cliente)

editar: la propiedad Número en el Cliente es única para cada entrada.

La relación debería dar como resultado un enunciado sql como este:

SELECT ..... FROM Department D LEFT OUTER JOIN Client C ON (D.ClientNumber = C.Number)

Es fácil hacer esto usando combinaciones en Linq, pero sería genial simplemente:

dbContext.Departments.Include(d => d.Client)

usando una propiedad virtual en la clase de departamento que contiene el cliente (si existe)


Como solución alternativa, ¿podría agregar tanto una propiedad ClientId como una propiedad ClientNumber? Después de asegurarse de que el Cliente no sea nulo, puede acceder a ClientNumber desde la propiedad del Cliente virtual:

public class Client { public string Id { get; set; } public string Name { get; set; } public int Number { get; set; } } public class Department { public int Id { get; set; } public string Name { get; set; } public string ClientId { get; set; } public virtual Client Client { get; set; } [NotMapped] public int? ClientNumber { get { return Client != null ? Client.Number : null; } } }


Como dijo @Gert Arnold, esto no es "todavía" posible. Entity Framework 7 apoyará esta característica.

Para aquellos que quieran mantenerse al día, aquí está la Discusión de características / Votación.

Restricción única (es decir, Clave candidata)