Pergunta

Eu estou trabalhando com algumas mesas legados que têm relações, mas essas relações não foram explicitamente definido como chaves primárias / estrangeiros. Eu criei um arquivo dbml usando "Classes LINQ to SQL" e estabeleceu a associação adequada Case.CaseID = CaseInfo.CaseID. Minha classe resultante é CasesDataContext.

As minhas tabelas (um para muitos):

Case
------------------
CaseID (int not null)
MetaColumn1 (varchar)
MetaColumn2 (varchar)
MetaColumn3 (varchar)
...


CaseInfo
------------------
CaseInfoID (int)
CaseID (int nulls allowed)
CaseInfoMeta (varchar)
...

Eu sou novo para LinqToSQL e estou tendo problemas para fazer ..

CasesDataContext db = new CasesDataContext();
var Cases = from c in db.Cases
            where c.CaseInfo.CaseInfoMeta == "some value"
            select c;

(Edit) Meu problema é que CaseInfo ou CaseInfos não está disponível como um membro dos casos.

Eu ouvi de um colega que eu poderia tentar ADO.Net Entity Data Model para criar minha classe Contexto de dados, mas ainda não tentei isso ainda e queria ver se eu estaria perdendo meu tempo ou devo ir outra rota . Todas as dicas, links, ajuda seria mais apreciado.

Foi útil?

Solução

Volte para o designer e verificar a relação está configurado corretamente. Aqui está um exemplo da vida real, com BillStateMasters têm "CustomerMasters1" propriedade (clientes para o Estado): text alt

Ps. nomeação está sendo limpado ...

Update 1: Você também precisa ter certeza de ambas as tabelas têm uma primária definida. Se a chave primária não está definida no banco de dados (e não pode ser definido por qualquer motivo), certifique-se de defini-los no designer. Abra as propriedades da coluna, e defini-lo como chave primária. Dito isto, entidade rastreamento também não vai funcionar se você não tem uma chave primária para a entidade, que por meio exclui-lo silenciosamente não atualiza a entidade. Então, certifique-se de rever todas as entidades e tê-los todos com uma chave primária (como eu disse, se ele não pode estar no db, em seguida, no designer).

Outras dicas

CasesDataContext db = new CasesDataContext();
var Cases = from c in db.Cases
            join ci in db.CaseInfo on
            ci.ID equals c.InfoID
            where ci.CaseInfoMeta == "some value"
            select new {CASE=c, INFO=ci};

meu "juntar-se" LINQ é um pouco enferrujado, mas acima deve chegar perto do que você está depois.

É o conjunto associação para One to One ou um para muitos? Se você tem o conjunto de associação de um para muitos, então o que você tem é um EntitySet, não um EntityRef e você vai precisar usar uma cláusula onde no conjunto dependente para obter o valor correto. Eu suspeito que você quer um One to One relacionamento, o que não é o padrão. Tente mudá-lo para um a um e ver se você pode construir a consulta.

Nota:. Eu estou apenas adivinhando, porque você não tem realmente nos disse que o "problema" é realmente

A sua consulta é correta e deve retornar um conjunto de resultados de consulta de caso objetos.

Então ... qual é o problema?

(Edit) Meu problema é que CaseInfo não está disponível em casos ... ou seja, não c.CaseInfo não existe onde eu sou assumindo que seria se não houvesse explícita de chave primária / estrangeira relacionamentos.

O que você quer dizer com "não disponível"? Se você criou a associação no designer como você diz que fez, em seguida, a consulta deve gerar SQL algo ao longo das linhas de

SELECT [columns] 
FROM Case INNER JOIN CaseInfo 
   ON Case.CaseID = CaseInfo.CaseID
WHERE CaseInfo.CaseInfoMeta = 'some value'

Você depurado sua consulta LINQ para fazer o SQL ainda gerados? O que voltar?

Algumas coisas que você pode querer tentar:

Verifique as propriedades da associação. Certifique-se de que a propriedade Parent foi criado como Public. Ele faz isso por padrão, mas algo pode ter mudado.

Uma vez que você não está recebendo CaseInfo em C, tente digitá-lo na outra direção para ver se você começa ci.Case com intellisense.

Excluir e recriar a associação todos juntos.

Há algo muito básico acontecendo de errado se os membros filhos não estão aparecendo. Poderia ser melhor para eliminar o dbml e recriar a coisa toda.

Se tudo isso falhar, mude para NHibernate. :)

Depois de alguns testes, eu tenho certeza que as relações FK são necessários no DB independentemente de qualquer associações são criadas no Linq-to-SQL. ou seja, se você não tê-los explicitamente definido no DB, então você terá que fazer uma junção manualmente.

É este c #? Acho que você precisa == em vez de = nesta linha:

where c.CaseInfo.CaseInfoMeta = "some value"

deve ler

where c.CaseInfo.CaseInfoMeta == "some value"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top