我正在編寫多租戶應用程序。幾乎所有的表都有「AccountId」來指定哪個租戶擁有該記錄。我有一張表中包含所有租戶都可以訪問的「供應商」列表,但沒有AccountId。實體框架多租戶自定義共享表
一些租戶想要將自定義字段添加到供應商記錄。
如何在Code First Entity Framework中設置?這是我迄今爲止的解決方案,但我不得不提取所有最喜歡的供應商,因爲我無法在EF中編寫子查詢,然後在更新記錄時發生刪除。
public class Vendor
{
public int Id { get;set;}
public string Name { get; set; }
}
public class TenantVendor
{
public int AccountId { get;set;}
public int VendorId{ get;set;}
public string NickName { get; set; }
}
// query
// how do I only get single vendor for tenant?
var vendor = await DbContext.Vendors
.Include(x => x.TenantVendors)
.SingleAsync(x => x.Id == vendorId);
// now filter tenant's favorite vendor
// problem: if I update this record later, it deletes all records != account.Id
vendor.TenantVendors= vendor.FavoriteVendors
.Where(x => x.AccountId == _account.Id)
.ToList();
我知道我需要使用多列外鍵,但我在設置時遇到了問題。
架構應該像下面..
Vendor
Id
FavVendor
VendorId
AccountId
CustomField1
然後我可以查詢供應商,獲取FavVendor的登錄帳戶,並繼續我的快樂的方式。
我目前的解決方案,這給了我一個額外的「VENDOR_ID」外鍵,但不通過建立「一對一」的關係,並有外鍵是設置正確,
這應該是可能的「供應商ID」 和 「帳戶ID」
試圖讓這個設置在現在的實體框架......
public class Vendor
{
public int Id { get; set; }
public string Name { get; set; }
public virtual FavVendor FavVendor { get; set; }
}
public class FavVendor
{
public string NickName { get; set; }
[Key, Column(Order = 0)]
public int VendorId { get; set; }
public Vendor Vendor { get; set; }
[Key, Column(Order = 1)]
public int AccountId { get; set; }
public Account Account { get; set; }
}
// query to get data
var dbVendorQuery = dbContext.Vendors
.Include(x => x.FavVendor)
.Where(x => x.FavVendor == null || x.FavVendor.AccountId == _account.Id) ;
// insert record
if (dbVendor.FavVendor == null)
{
dbVendor.FavVendor = new FavVendor()
{
Account = _account,
};
}
dbVendor.FavVendor.NickName = nickName;
dbContext.SaveChanges();
也收到以下錯誤,當我嘗試和FavVendor.Vendor
設置外鍵FavVendor_Vendor_Source:多重不是在關係中的作用「FavVendor_Vendor_Source「FavVendor_Vendor」有效。因爲「依賴角色」屬性不是關鍵屬性,所以「依賴角色」的多重性的上界必須爲「*」。