Архитектура мультитенантных общих данных Entity Framework: один столбец, несколько внешних ключей
У меня есть следующая структура данных:
//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;
}
Я получаю следующую ошибку:
The foreign key component 'TenantId' is not a declared property on type 'SpecialOrder'. Verify that it has not been explicitly excluded from the model and that it is a valid primitive property.
Ошибка возникает при использовании конфигурации Fluent Api:
config.HasRequired(p => p.OtherClass)
.WithMany(oc => oc.SpecialOrders)
.HasForeignKey(p => new { p.TenantId, p.OtherClassId});
БезOtherClass
ссылка вSpecialOrder
Я могу создавать объекты свободно без проблем (в том числеSpecialOrder
, SuperSpecialOrder
так далее).
Кто-нибудь знает, что происходит? Я потерян здесь :(
Edit Я видел в других вопросах, что люди удаляют TenantId из таблиц, это не вариант, так как первичные ключи не являются уникальными для арендаторов, и мы хотим сохранить архитектуру общих данных.
Я знаю, что обходной путь - второй TenantId в классе SpecialOrder, но мне это не кажется логичным.