Pergunta

Eu estou brincando com LinqToSQL usando um banco de dados multi-lingual existente, mas eu estou correndo em problemas de mapeamento uma relação bastante importante one-to-one, então eu suspeito que eu estou usando o recurso incorretamente para meu projeto de banco de dados.

Suponha duas tabelas, Categoria e CategoryDetail. Categoria contém o CategoryId (PK), ParentId e TemplateID. CategoryDetail contém o CategoryId (FK), LanguageId, título e descrição (no idioma apropriado), com uma PK combinado de CategoryId e LanguageId.

Se eu arrastar e soltar essas tabelas para o designer LinqToSQL, o modelo de objeto resultante tem Categoria com uma coleção de objetos CategoryDetail, que nunca deve ser o caso. Eu gostaria de ser capaz de filtro na LanguageId no nível DataContext, o que significa que toda a categoria é encapsulado dentro Category.CategoryDetail, nem todos versão em língua encapsulado dentro Category.CategoryDetails.

Esta base de dados funcionou bem na minha biblioteca de objetos de idade (um costume old-school BOL e DAL), mas temo que LinqToSQL exigiria que isso mude, a fim de me dar o resultado necessário.

Qual é a melhor maneira de fazer essa relação (e filtragem de idioma) tão simples quanto possível?

Foi útil?

Solução

Você pode visualizar as propriedades da associação. (Botão direito do mouse na linha que representa as propriedades de associação e de espectáculos.) As propriedades irá dizer-lhe se é um relacionamento um-para-um ou um-para-muitos. Isto reflecte-se no código, tendo quer uma associação única entidade (um-para-um) ou uma associação conjunto de entidades (um-para-muitos).

Outras dicas

Eu teria que assumir não pode ser um verdadeiro 1 a 1. Parece que você tem um PK de CatID e Lang ID na tabela Detalhes Cat o. Isso explicaria por que seu colocando uma coleção. Eu posso estar errado quanto você didnt mencionar a PK do da tabela de CatDetails

EDIT: A Pk de CatID combinados e Lang ID faz que uma relação de 1: m, e LINQ to SQL está realmente fazendo a coisa correta. A única maneira que poderia ser um verdadeiro 1: 1 é se você tivesse um lang ID na mesa de gato bem e que fazia parte do FK. I htink você pode ter que repensar o que você quer fazer, ou como você deseja implementá-lo.

Eu acho que o LINQ to SQL modelos da estrutura do banco de dados diretamente. Você tem duas mesas para que ele cria 2 objetos.

Você já teve um olhar para LINQ to Entities isso permite que você crie outra camada acima da strucure banco de dados para fazer para as classes mais legíveis.

Uma vez que você não tem uma relação 1: 1 o mapeamento por si só não irá fornecer a funcionalidade desejada. No entanto, é fácil de fornecer um método na classe gerada automaticamente pai que faz o trabalho:

public partial class Category 
{
  public IEnumerable<CategoryDetail> GetDetailsByLanguage(string langID)
  {
    return this.CategoryDetails.Where(c => c.LangID == langID);
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top