这是我的问题:我需要代表一对多的关系。一家公司有很多商店。 这是我的代码:
public class Company
{
public int Id;
public string Name;
public string Email;
public Guid GUID;
}
public class Store
{
public int Id;
public int CompanyId;
public string Name;
public int NoOfEmployees;
public Guid GUID;
}
我的问题是:如何在不使用虚拟和散列集的情况下工作?这个实现好吗?
谢谢。
答案 0 :(得分:3)
您只需使用List
即可保存一家公司的所有商店。
public class Company
{
public int Id;
public string Name;
public string Email;
public Guid GUID;
// List of all Stores
public List<Store> AllTheStores;
public Company()
{
AllTheStores = new List<Store>();
}
}
修改强>
如果多个public int CompanyId;
可以拥有相同的Company
,则Store
属性才有意义。否则,您可以通过公司访问商店:
Company c = new Company();
Store s = c.AllTheStores.Find(x=>x.Name == "MyStore");
// or
List<Store> largeStores = c.AllTheStores.Where(x=>x.NoOfEmployees > 200).ToList();
答案 1 :(得分:1)
正如你所说
一家公司有很多商店。
在这句话中你的回答是。
使用Company
课程如下,而不是将companyID
放入Store
课程
public class Company
{
public int Id;
public string Name;
public string Email;
public Guid GUID;
// put a List of all Stores
public List<Store> Stores;
}
答案 2 :(得分:1)
所以回答这是如何运作的问题。
考虑到您拥有想要获得所有商店的公司的ID,您可以这样做:
using (var dbcontext = new DbContext())
{
var stores = await dbcontext.Stores.Where(x => x.CompanyId == companyId).ToListAsync();
}
您不需要导航属性。我从未拥有过它们,它们只会给我带来问题,我并不是说它们会给您带来问题。它们只是一个方便的东西(从它看起来似乎),在我看来,它掩盖了底层的SQL表示和EF可能正在运行的查询。现在,几乎没有你真正关心EF生成的查询,当你到达它们时,你可能会发现导航属性阻碍了你。
如果您想再次保存记录,只需为每个Store
分配一个真实的Company.Id
,即可履行外键义务。
您可以进行的一项更改(如果这适用于您的情况)是您可以删除int Id
并使用CompanyId
作为主键和外键
public class Store
{
// public int Id; just remove this
public int CompanyId; // make this a foreign key using fluent or attributes.
public string Name;
public int NoOfEmployees;
public Guid GUID;
}
这确保您保留1对多人的关系,如果那些很多只应存在于一家公司。如果没有,那么不要担心上述情况。
答案 3 :(得分:0)
您应该使用公司类对象本身而不是仅在Store类中使用CompanyId。
public class Company
{
public int Id;
public string Name;
public string Email;
public Guid GUID;
public List<Store> Stores;
}
public class Store
{
public int Id;
public Company Company; // Can get CompanyId using StoreObj.Company.Id
public string Name;
public int NoOfEmployees;
public Guid GUID;
}