Tengo una tabla en mi base de datos Cliente y tengo una tabla de base de datos externa Cliente con mucha información, creé una vista de Cuenta de cliente para representar esto
Ver - CuentaCliente
CREATE VIEW CustomerAccount AS SELECT c.Id, c.CustomerNumber, a.Name, ISNULL(DateTimeCreated, 0) as CreatedDate, ISNULL(DateTimeUpdated, ISNULL(DateTimeCreated, 0)) as UpdatedDate, ~InactiveFlag as Active FROM externaldatabase..CMAccount a INNER JOIN mydatabase..Customer c on a.URI = c.CustomerNumber;Mi mesa - Cliente
CREATE TABLE [dbo].[Customer]( [Id] [int] IDENTITY(1,1) NOT NULL, [CustomerNumber] [int] NOT NULL, [CreatedDate] [datetime] NOT NULL, [UpdatedDate] [datetime] NOT NULL, [Active] [bit] NOT NULL, CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GOLas tablas Product1 y Product2 tienen claves foráneas para la tabla Customer de mi base de datos
Configuración para la tabla Producto1
public void Configure(EntityTypeBuilder<Product1> builder) { builder .HasKey(b => b.Id); // all other properties builder .HasOne(b => b.Customer) .WithMany(); }Configuración para la tabla Product2
public void Configure(EntityTypeBuilder<Product2> builder) { builder .HasKey(b => b.Id); // all other properties builder .HasOne(b => b.Customer) .WithMany(); }Configuración para la mesa Cliente:
public void Configure(EntityTypeBuilder<Customer> builder) { builder .HasKey(b => b.Id); builder .HasIndex(b => b.CustomerNumber); builder .Property(b => b.CustomerNumber) .IsRequired(); builder .Property(b => b.CreatedDate) .HasColumnType("datetime") .IsRequired(); builder .Property(b => b.UpdatedDate) .HasColumnType("datetime") .IsRequired(); builder .Property(b => b.Active) .IsRequired(); }Configuración para la vista CustomerAccount:
public void Configure(EntityTypeBuilder<CustomerAccount> builder) { builder .ToView(nameof(CustomerAccount)); builder .HasMany(c => c.Product1Setups) .WithOne() .HasForeignKey(p1 => p1.CustomerId); builder .HasMany(c => c.Product2Setups) .WithOne() .HasForeignKey(p2 => p2.CustomerId); }Incluso si uso la sobrecarga de cadenas como se muestra a continuación, sucede lo mismo:
builder .HasMany(c => c.Product2Setups) .WithOne() .HasForeignKey("CustomerId");Esperaba solo una relación lógica entre ellos, pero al seleccionar Product1 o Product2 EF core genera una consulta con un nombre de columna no válido CustomerId1 . Ambas tablas ya son una columna denominada CustomerId a la que hace referencia mydatabase..Customer del ejemplo anterior.
¿Hay alguna solución para eso?
ACTUALIZACIÓN - TL/DR:
En resumen, lo que debo hacer es tener dos objetos principales, una tabla y una vista a las que hagan referencia las mismas columnas en las tablas secundarias, ya que la vista comparte básicamente la misma clave única.