我有這種類型的實體
公司提供'n'服務和公司'n'集裝箱'n'服務
當我向公司添加一個帶有容器的服務時......我有1個服務和1個帶有1個服務的容器。當我添加另一個服務,沒有容器(和uuid),到同一家公司...我有2個服務和1個容器與2服務! :(
為什麼這個?
我的實體配置的快速架構。
容器:
HasRequired(e => e.company)
.WithMany(e => e.container)
.HasForeignKey(e => e.id_company)
.WillCascadeOnDelete(false);
服務:
HasOptional(e => e.container)
.WithMany(e => e.services)
.HasForeignKey(e => e.uuid_container)
.WillCascadeOnDelete(false);
從數據庫中檢索數據的代碼
if (!result.Any(x => x.id == cfi.id_company))
{
result.Add(cfi.Company);
}
else
{
result.Where(x => x.id == cfi.id_company).FirstOrDefault().result
.Where(x => x.id == cfi.id_company).FirstOrDefault();
a.services.Add(cfi.Company.services.FirstOrDefault());
}
cfi是一個服務列表,包括具有容器和服務的公司
公平地說,我很反感你的代碼並且無法弄清楚你想要做什麼。我將根據您描述實體和關係的方式,嘗試為您的問題提供正確的方法。
你的實體:
public class Company
{
public int id { get; set }
public virtual ICollection<Sevice> Services { get; set; }
public virtual ICollection<Container> Containers { get; set; }
}
public class Container
{
public int id { get; set; }
public int id_company { get; set; }
public virtual Company company { get; set; }
public virtual ICollection<Sevice> Services { get; set; }
}
public class Sevice
{
public int id { get; set; }
public int? id_company { get; set; }
public int? id_container { get; set; }
public virtual Company company { get; set; }
public virtual Container container { get; set; }
}
您說您還沒有向數據庫添加任何數據,因此我們將重點放在檢索現有數據上。
using (Context context = new Context())
{
var company = context.Companies.ToList();
}
如果您已禁用延遲加載,則需要在子表中包含include
。
using (Context context = new Context())
{
var company = context.Companies.Include(g => g.Services)
.Include(g => g.Containers)
.Include(g => g.Containers.Select(s => s.Services))
.ToList();
}
如果您已正確定義關係,則公司對象應正確加載所有對象。
如果我對某些事情做錯了,請告訴我,到目前為止好運。
最終編輯
讓我們有示例數據
Company { id: 1 }
Container { id: 1, id_company: 1 }
Service { id: 1, id_company: 1, id_container: 1 }
Service { id: 2, id_company: 1, id_container: null }
然後使用這樣的get方法:
using (Context context = new Context())
{
var company = context.Companies.Where(x => x.id == someCompanyId)
.Include(g => g.Services)
.Include(g => g.Containers)
.Include(g => g.Containers.Select(s => s.Services))
.ToList();
}
最終會得到如下所示的對象:
Company
services: (1, 2)
containers: (1)
services: (1)
公司是對象,服務和容器是對象的集合。括號中的數字是集合中的enitity對象的id。你不需要在你發布的代碼中添加任何東西。