Pregunta

Estoy jugando con LinqToSQL usando una base de datos multilingüe existente, pero tengo problemas al mapear una relación de uno a uno bastante importante, por lo que sospecho que estoy usando la función incorrectamente para el diseño de mi base de datos.

Supongamos dos tablas, Category y CategoryDetail. La categoría contiene el CategoryId (PK), ParentId y TemplateId. CategoryDetail contiene el CategoryId (FK), LanguageId, Título y Descripción (en el idioma apropiado), con una PK combinada de CategoryId y LanguageId.

Si arrastro y suelto estas tablas en el diseñador LinqToSQL, el modelo de objeto resultante tiene Categoría con una colección de objetos CategoryDetail, que nunca debería ser el caso. Me gustaría poder filtrar en LanguageId en el nivel de DataContext, lo que significa que toda la Categoría está encapsulada dentro de Category.CategoryDetail, no toda la versión de idioma encapsulada dentro de Category.CategoryDetails.

Esta base de datos funcionó bien en mi antigua biblioteca de objetos (un BOL y DAL personalizados de la vieja escuela), pero temo que LinqToSQL requiera que esto cambie para darme el resultado requerido.

¿Cuál es la mejor manera de hacer que esta relación (y el filtrado de idiomas) sea lo más perfecta posible?

¿Fue útil?

Solución

Puedes ver las propiedades de la asociación. (Haga clic con el botón derecho en la línea que representa la asociación y muestre las propiedades). Las propiedades le indicarán si se trata de una relación de uno a uno o de uno a varios. Esto se refleja en el código al tener una asociación de entidad única (uno a uno) o una asociación de conjunto de entidades (uno a varios).

Otros consejos

Debería suponer que no puede ser un verdadero 1 a 1. Parece que tienes un PK de ID de Cat y Lang en la tabla de Detalles del gato. Eso explicaría por qué está poniendo una colección. Podría estar equivocado, ya que no mencionaste los PK de la tabla de CatDetails

EDITAR: Un Pk combinado de ID de Cat y ID de Lang hace que sea una relación de 1: m, y Linq a SQL en realidad está haciendo lo correcto. La única forma en que podría ser un verdadero 1: 1 es si también tuvieras un ID de idioma en la mesa del gato y eso era parte del FK. Pienso que es posible que tenga que repensar lo que quiere hacer o cómo quiere implementarlo.

Creo que LINQ to SQL modela la estructura de la base de datos directamente. Tienes dos tablas por lo que crea 2 objetos.

¿Ha echado un vistazo a LINQ to Entities? Esto le permite crear otra capa por encima de la estructura de la base de datos para crear clases más legibles.

Como no tiene una relación 1: 1, la asignación por sí sola no proporcionará la funcionalidad deseada. Sin embargo, es fácil proporcionar un método en la clase primaria generada automáticamente que hace el trabajo:

public partial class Category 
{
  public IEnumerable<CategoryDetail> GetDetailsByLanguage(string langID)
  {
    return this.CategoryDetails.Where(c => c.LangID == langID);
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top