使用Entity Framework按约束表中的列进行筛选

时间:2012-06-12 08:40:43

标签: c# asp.net entity-framework

我的应用程序使用asp.net 4,C#和Entity Framework。我的数据库包含一个表Companies,其中包含许多Locations,而Devices有很多CompanyLocations键入当前登录的aspnet_user。

我使用网格视图来显示和修改单个Devices的{​​{1}}和CompanyLocations很容易实现这一点,因为它们与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}}

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

2 个答案:

答案 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();
            }
      }

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

链接越少,维护越简单,数据库越小(可忽略不计),图表越清晰。

有异议吗?