Uso de Entity Framework para filtrar por columnas en tablas restringidas

Mi aplicación usa asp.net 4, C# y Entity Framework. Mi base de datos contiene una tabla. Companies que tiene muchos Locations, que a su vez tiene muchas Devices. Una Company está codificado para el aspnet_user que está conectado actualmente.

Utilizo vistas de cuadrícula para mostrar y editar el Locations y Devices por una sola Company. Esto se logra fácilmente para el Locations ya que tienen un enlace directo a un Company...

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

Sin embargo, no puedo averiguar cómo filtrar el Devices by Company ya que solo tienen un enlace a un Location. Tenía la esperanza de usar algo similar a lo siguiente, pero recibo una excepción que indica que Location.CompanyGuid no pudo ser encontrado...

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

¿Alguna idea sobre cómo se puede lograr esto?

preguntado el 12 de junio de 12 a las 09:06

Esta es menos una pregunta de marco de entidad y más una pregunta de modelado/esquema. Debería volver a etiquetar (por ejemplo, eliminar asp.net lo cual es irrelevante y agregar esquema de base de datos) y agregue un diagrama de su esquema actual y de sus entidades. -

¿Puedes describir la versión más mínima de los modelos? En su caso, ¿por qué la empresa no tiene una relación de uno a muchos con ubicaciones y dispositivos? Al igual que para agregar un dispositivo, primero cree una ubicación. Entonces location.Devices.Add(device). Y luego dbconext.Companies.Add(location); -

"¿Por qué la empresa no tiene una relación de uno a muchos con ubicaciones y dispositivos"? Supongo que se refiere a dispositivos y ubicaciones. Había considerado esto, pero hay muchas otras tablas que también están vinculadas a una ubicación. Para ahorrar espacio, quería evitar vincular una gran cantidad de mesas a una empresa, ya que supuse que la empresa podía deducirse de la ubicación:

Cuando pones una propiedad virtual de ICollection<Device> Devices de las personas acusadas injustamente llamadas Company clase. Esta será solo una propiedad de navegación. Esto no creará ninguna columna en la tabla de la empresa para Dispositivos. Entonces tienes propiedad virtual Company comapany y FK int CompanyId en el modelo de Dispositivo. Esto solo agregará un campo a la tabla de dispositivos, lo que no es una gran pérdida de espacio. -

Gracias, Abhijit, supongo que simplemente haré lo que sea necesario y luego enviaré todas las tablas relevantes a la Compañía:

2 Respuestas

Considere que la empresa tiene una relación de uno a muchos con ubicaciones y dispositivos.

Cuando pones una propiedad virtual de ICollection<Device> Devices; de las personas acusadas injustamente llamadas Company class. Esta será solo una propiedad de navegación. Esto no creará ninguna columna en la tabla de la empresa para Dispositivos. Luego, tiene la empresa de propiedad virtual Company y FK int CompanyId en el modelo de dispositivo. Esto solo agregará un campo a Device Mesa que no es un gran desperdicio de espacio.

Respondido el 12 de junio de 12 a las 16:06

Descubrí que los dispositivos se pueden filtrar por empresa vinculando manualmente los datos con el siguiente código:

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

Sugeriría que este es un mejor diseño que crear enlaces directos entre tablas que ya tienen enlaces indirectos.

Menos enlaces dan como resultado un mantenimiento más simple, una base de datos más pequeña (insignificante) y diagramas más claros.

¿Alguna objeción?

Respondido el 25 de junio de 12 a las 16:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.