使用实体框架按受约束表中的列进行筛选
本文关键字:筛选 实体 框架 受约束 | 更新日期: 2023-09-27 18:36:48
我的应用程序使用 asp.net 4,C#和实体框架。我的数据库包含一个表Companies
它有很多Locations
,而又有很多Devices
。Company
键指向当前登录的aspnet_user。
我使用网格视图来显示和编辑单个Company
的Locations
和Devices
。对于Locations
来说,这很容易实现,因为它们与Company
有直接联系......
LocationListEntityDataSource.AutoGenerateWhereClause = true;
LocationListEntityDataSource.WhereParameters.Clear();
LocationListEntityDataSource.WhereParameters.Add("CompanyGuid", System.Data.DbType.Guid, Tools.Tools.getCompanyGuidString());
但是,我无法弄清楚如何按Company
过滤Devices
,因为它们只有指向Location
的链接。我希望使用类似于以下内容的东西,但我得到一个异常,指出找不到Location.CompanyGuid
......
DeviceListEntityDataSource.AutoGenerateWhereClause = true;
DeviceListEntityDataSource.WhereParameters.Clear();
DeviceListEntityDataSource.WhereParameters.Add("Location.CompanyGuid", System.Data.DbType.Guid, Tools.Tools.getCompanyGuidString());
关于如何实现这一目标的任何想法?
将公司视为与位置和设备具有一对多关系。
当您将ICollection<Device> Devices;
的虚拟属性放入Company class
时。这将只是一个导航属性。这不会在公司表中为设备创建任何列。然后,在设备模型中具有虚拟属性公司 comapany 和 FK int CompanyId。这只会向Device
表添加一个字段,这不是很大的空间浪费。
我发现公司可以使用以下代码手动绑定数据来过滤设备:
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();
}
}
我建议这是一个比在已经具有间接链接的表之间创建直接链接更好的设计。
更少的链接导致更简单的维护、更小的数据库(可以忽略不计)和更清晰的图表。
有异议吗?