Uso de Entity Framework para filtrar por columnas en tablas restringidas
Frecuentes
Visto 795 veces
0
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?
2 Respuestas
0
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
0
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 c# asp.net entity-framework or haz tu propia pregunta.
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. - Danny Varod
¿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 luegodbconext.Companies.Add(location);
- Abhijit-K"¿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: user1374841
Cuando pones una propiedad virtual de
ICollection<Device> Devices
de las personas acusadas injustamente llamadasCompany
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 virtualCompany comapany
y FKint 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. - Abhijit-KGracias, Abhijit, supongo que simplemente haré lo que sea necesario y luego enviaré todas las tablas relevantes a la Compañía: user1374841