我的应用程序使用asp.net 4,C#和Entity Framework。我的数据库包含一个表Companies
,其中包含许多Locations
,而Devices
有很多Company
。 Locations
键入当前登录的aspnet_user。
我使用网格视图来显示和修改单个Devices
的{{1}}和Company
。 Locations
很容易实现这一点,因为它们与Company
...
LocationListEntityDataSource.AutoGenerateWhereClause = true;
LocationListEntityDataSource.WhereParameters.Clear();
LocationListEntityDataSource.WhereParameters.Add("CompanyGuid", System.Data.DbType.Guid, Tools.Tools.getCompanyGuidString());
但是,由于Devices
只有Company
的链接,我无法弄清楚如何过滤Location
Location.CompanyGuid
。我希望使用类似下面的内容,但我得到一个例外,说明找不到DeviceListEntityDataSource.AutoGenerateWhereClause = true;
DeviceListEntityDataSource.WhereParameters.Clear();
DeviceListEntityDataSource.WhereParameters.Add("Location.CompanyGuid", System.Data.DbType.Guid, Tools.Tools.getCompanyGuidString());
...
{{1}}
关于如何实现这一目标的任何想法?
答案 0 :(得分:0)
考虑公司与地点和设备之间存在一对多的关系。
将ICollection<Device> Devices;
的虚拟媒体资源添加到Company class
时。这只是一个导航属性。这不会在公司表中为设备创建任何列。然后,您在Device模型中拥有虚拟财产公司comapany和FK int CompanyId。这只会在Device
表中添加一个字段,这不会造成太大的浪费。
答案 1 :(得分:0)
我发现公司可以使用以下代码手动绑定数据来过滤设备:
protected void Page_Load(object sender, EventArgs e)
{
(SalesSQLEntities db = new SalesSQLEntities())
{
// Get user ID
System.Guid UserID = Tools.Tools.getCompanyGuid();
// Find all transactions of this company
var devItemList = (from dev in db.Devices
where dev.Location.CompanyGuid == UserID
select dev).ToList();
DeviceList.DataSource = devItemList;
DeviceList.DataBind();
}
}
我建议这比在已经有间接链接的表之间创建直接链接更好的设计。
链接越少,维护越简单,数据库越小(可忽略不计),图表越清晰。
有异议吗?