Arquitectura de datos compartidos multitenant de Entity Framework: una sola columna, varias claves externas
Tengo la siguiente estructura de datos:
//property Notification
abstract class BindableBase { }
//base class for all tenant-scoped objects
abstract class TenantModelBase : BindableBase
{
int TenantId;
}
abstract class Order : TenantModelBase
{
Customer Customer; //works: mapped using TenantId and CustomerId
Product Product; //again, works with TenantId and ProductId
string ProductId;
string CustomerId;
}
class Customer: TenantModelBase
{
string CustomerId;
}
class Product : TenantModelBase
{
string ProductId;
}
class SpecialOrder : Order
{
OtherClass OtherClass; //this fails!, see below
string OtherClassId;
}
class SuperSpecialOrder : SpecialOrder { }
class OtherClass : TenantModelBase
{
string OtherClassId;
}
Obtuve el siguiente error:
El componente de clave foránea 'TenantId' no es una propiedad declarada en el tipo 'SpecialOrder'. Verifique que no se haya excluido explícitamente del modelo y que sea una propiedad primitiva válida.
Se produce un error al utilizar la configuración de Fluent Api:
config.HasRequired(p => p.OtherClass)
.WithMany(oc => oc.SpecialOrders)
.HasForeignKey(p => new { p.TenantId, p.OtherClassId});
Sin elOtherClass
referencia enSpecialOrder
Puedo crear objetos libremente sin problemas (incluyendoSpecialOrder
, SuperSpecialOrder
etc).
¿Alguien tiene una pista de lo que está pasando? Estoy perdido aquí :(
Editar He visto en otras preguntas que las personas eliminan TenantId de las tablas, esta no es una opción ya que las claves primarias no son únicas entre los inquilinos y queremos mantener la arquitectura de datos compartida.
Sé que la solución es tener un segundo TenantId en la clase SpecialOrder, pero esto no me parece lógico.