使用实体框架按受约束表中的列进行筛选

本文关键字:筛选 实体 框架 受约束 | 更新日期: 2023-09-27 18:36:48

我的应用程序使用 asp.net 4,C#和实体框架。我的数据库包含一个表Companies它有很多Locations,而又有很多DevicesCompany键指向当前登录的aspnet_user。

我使用网格视图来显示和编辑单个CompanyLocationsDevices。对于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();
            }
      }

我建议这是一个比在已经具有间接链接的表之间创建直接链接更好的设计。

更少的链接导致更简单的维护、更小的数据库(可以忽略不计)和更清晰的图表。

有异议吗?