0

我的应用程序使用 asp.net 4、C# 和实体框架。我的数据库包含一个有很多的表CompaniesLocations而这又有很多Devices。ACompany被键入到当前登录的 aspnet_user。

我使用网格视图来显示和Locations编辑Devices单个Company. 这很容易实现,Locations因为它们有直接链接到Company...

LocationListEntityDataSource.AutoGenerateWhereClause = true;
LocationListEntityDataSource.WhereParameters.Clear();
LocationListEntityDataSource.WhereParameters.Add("CompanyGuid", System.Data.DbType.Guid, Tools.Tools.getCompanyGuidString());

但是我无法弄清楚如何过滤DevicesCompany因为它们只有一个指向Location. 我曾希望使用类似于以下内容的东西,但我得到一个异常,指出Location.CompanyGuid找不到......

DeviceListEntityDataSource.AutoGenerateWhereClause = true;
DeviceListEntityDataSource.WhereParameters.Clear();
DeviceListEntityDataSource.WhereParameters.Add("Location.CompanyGuid", System.Data.DbType.Guid, Tools.Tools.getCompanyGuidString());

关于如何实现这一点的任何想法?

4

2 回答 2

0

考虑公司与位置以及设备具有一对多关系。

当你把一个虚拟属性ICollection<Device> Devices;放到Company class. 这将只是一个导航属性。这不会在公司表中为设备创建任何列。然后,您在 Device 模型中有虚拟财产 Company comapany 和 FK int CompanyId。这只会在Device表格中添加一个字段,不会浪费太多空间。

于 2012-06-12T15:39:52.170 回答
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();
            }
      }

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

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

有异议吗?

于 2012-06-13T09:42:24.107 回答