我試圖創建一個關係公司的數據模型,首先在實體框架代碼中的相同類型。我想單向創建關係,所以當一家公司增加另一個作爲其客戶時,另一家公司不會自動將該公司作爲供應商。實體框架中的同一類的多個列表
public class Company {
[Key]
public string Id { set; get; }
public string Name { set; get; }
public virtual ICollection<Company> Customers { set; get; }
public virtual ICollection<Company> Suppliers { set; get; }
}
當我像這樣更新數據庫時,我最終得到一個名爲「CompanyCompanies」的連接表。
CompanyCompanies
| Company_Id | Company_Id1 |
|------------|-------------|
| 1234 | 1234 |
我要創建兩個表來連接這些值,就像這樣:
CompanyCustomers
| Company_Id | Customer_Id |
|------------|-------------|
| 1234 | 1234 |
CompanySuppliers
| Company_Id | Supplier_Id |
|------------|-------------|
| 1234 | 1234 |
我已經看了很多流利的API,並試圖定義那裏的關係,但我似乎無法得到我的頭如何做到這一點。我發現了很多使用不同實體的例子,但只有this answer與自身的關係。但是,當我從該問題實施解決方案並更新數據庫時,出現連接超時的錯誤。
modelBuilder.Entity<Company>()
.HasMany(c => c.Customers)
.WithMany()
.Map(m =>
{
m.ToTable("CompanyCustomer");
m.MapLeftKey("CompanyId");
m.MapRightKey("CustomerId");
});
錯誤編號:-2,狀態:0,類別:11 執行超時過期。
完成操作或服務器沒有響應之前超時時間已過。
當我試着使用這兩個CompanyCustomer和CompanySupplier我得到antoher錯誤
無論是參數@objname不明確或所要求的@objtype(列)是錯誤的。
我也嘗試爲關係創建一個新對象,並讓Company對象擁有CompanyCustomers的列表,但是當我用這個更新數據庫時,我得到了一個包含三列的連接表。
public class CompanyCustomer
{
[Key, Column(Order = 0)]
[ForeignKey("Company")]
public string CompanyId { set; get; }
[Key, Column(Order = 1)]
[ForeignKey("Customer")]
public string CustomerId { set; get; }
public virtual Company Company { set; get; }
public virtual Company Customer { set; get; }
}
CompanyCustomer
| CompanyId | CustomerID | Company_Id |
|-----------|------------|------------|
| 1234 | 1234 | 1234 |
我不明白我怎麼能建立同樣的實體之間的一些關係類型。我可以在流利的api幫助下做到這一點,還是必須重新設計我的模型?
超時並不意味着模型不正確,只是遷移需要很多時間來執行DDL語句。從技術上講,這兩個'HasMany - WithMany'配置應該可以。 –
當你說你做了隱式的'many-to-many'配置(使用'.HasMany(c => c.Customers).WithMany()',你是否對其他關係'CompanySuppliers'做了同樣的事情?當我這樣做,並看看生成的遷移,這正是你想要的。 –
我更新了我的問題伊凡。我只有在收集其中一個時纔得到超時。當我嘗試使用兩種方法時,出現錯誤,說@objname是ambigous ... –