last day (14 days later) » 

2:00 PM
1
Q: Qual é a forma correta de fazer esse relacionamento com herança e chave estrangeira?

Tiago SilvaEstou tentando fazer uma ligação simples, mas estou recebendo um erro do Entity Framework ao tentar atualizar o banco de dados (usando migrations). Esse é o modelo: public abstract class Area { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; }...

 
Ta errado quando você une ICollection<Assunto> que é também um herança da classe Area!
 
Olá @Maria, obrigado pela ajuda. Apesar de ser herança, são duas tabelas distintas no banco de dados, conforme anotação Table. E ICollection<Assunto> é apenas uma propriedade de navegação, certo? Então porque estaria errado? Detalhe, sem essa propriedade de navegação (ICollection<Assunto>) o mesmo erro persiste.
 
Assuntos Herda de quem?
 
De Area, claro.
 
Então eu vou colocar o correto como uma resposta ai conforme a resposta você indica logo abaixo no comentário o que deseja fazer a mais pode ser?
 
2:00 PM
Sim, por favor!
 
Se tiver por ai.
 
Agora consegui..
 
opa
você viu o modelo amigo
primeiro modelo? para você entender o erro!
eu já sei o que ta acontecendo mas, eu quero que chegue em você!
 
Viu meu último comentário?

acho que estou entendendo a questão. Bom, eu não mapearia Area em Db. Eu estaria mapeando Departamento e Assunto. Area é apenas uma herança não clássica, como se fosse apenas para facilitar a declaração das classes, como para não precisar declarar Id e Descricacao nas duas classes. Então, creio que por isso, por conta do EF, essa estrutura não pode ser montada. Seria isso?
 
entendeu
então quando se usa Entity é obrigado passar a classe Pai
inclusive tiago ela que fica no dbSet!
é feito uma engenharia em tempo de execução!
olha lá no DbSet do contexto quem ta lá!
?
 
2:11 PM
Sim, entendi. Como se está trabalhando com Entity fazer coisas que fazemos, quando não tem nada analisando a estrutura, como esse tipo de coisa que quiz fazer, é inaceitável.
Sim, vi, você setou Area
 
na hora de dar um add seria assim olha só:
Assunto assunto = new Assunto();
assunto.Titulo = "Assunto 1";
assunto.Descricao = "Descricao 1";

Departamento departamento = new Departamento();
departamento.Nome = "Nome 2";
departamento.Descricao = "Descricao 2";


db.Area.Add(assunto);
db.Area.Add(departamento);

db.SaveChanges();
 
Na verdade eu esperaria que o Entity nem pensasse na existência de Area.
O que tenho que fazer então é remover essa herança. Isso que está causando confusão para ele.
 
n
não tá causando
o que ta causando a confusão é isso tiago. vou pegar o error
may cause cycles or multiple cascade paths
 
porque entenda, não é para existir Area em meu banco de dados.
 
cycles é circulo, referencia cruzada!
Tiago se entende legal de herança? quero que você entenda!
 
2:14 PM
Não entendo!
 
herança é quando você adquiri o comportamento total da classe que herda.
 
Se entendo algo, é o funcionamento.. sei que Assunto e Departamento iriam herdar os campos ID e Descricao.. sobre estar correto esse tipo de declaração de herança por conta de uma correta engenharia, ai não sei mesmo.
 
metodos, ações, propriedades.
é isso sim! o que você disse!
 
No que estaria errado dizer que Departamento e Assunto herdam a estrutura de Area
 
quando se trabalha com entitity framework e o obrigada a utlizar herança porque você ta fazendo isso no banco ele cria a tabela area e suas filhas
 
2:16 PM
?
 
é assim que funciona
 
certo, é uma questão do motor do Entity, que se baseia em engenharia correta.
 
ele se basea em engenharia e formas normais de banco
no banco é relacinamento 1 para 1
na engenharia é herança
eu já fiz em um projeto isso funciona muito bem
como ele grava
a parte da area na tabela area
a parte de assunto na tabela assunto relacionado com area
a parte do departamento na tabela departamento relacionada com area
é uma forma de dividir responsabilidades no banco
deixa eu fazer um teste aqui e te falo.
 
Certo, o que pegou para mim foi as questões de engenharia então.
Mas entendeu que eu não pretendo ter uma tabela Area, né?
É como se eu pudesse colocar um [NotMapped] em cima de Area, eu só quero estipular uma estrutura para a classe.
 
pera um pouco vou propor outra solução
 
2:27 PM
Também fiz uma edição na minha pergunta
 
2:38 PM
se ta por ai
 
sim
 
ele não ta colocando o auto-incremento na chave!
kkkk
por ser herança
kkk
 
mas viu minha edição da pergunta? Fiz o modelo de forma simples, como preciso, e ainda assim continua dando erro. Veja lá, sem herança!
 
deixa eu ver
nossa
 
2:56 PM
Não é possível, tem algo muito bobo passando despercebido.
 
é sim!
mas, eu to com tantos migrations que deu rolo nos meus kkkk
Tiago.
 
Estou aqui
 
não dá certo.
herança dessa forma não dá certo, ele pega o código do assnto e coloca na tabela da relação.
vira uma caca!
 
Não estou nem me importando mais com a herança, entendo que o EF não suporta esse esquema.

O meu modelo sem herança, pelo menos, tinha que funcionar
 
deixa eu fazer o último teste!
vou copiar o que você fez lá na pergunta
ta com problema de tempo!
?
 
3:02 PM
não
 
blz
deixa eu copiar lá
1 departamento tem uma coleção de assuntos?
 
sim
 
funcionou aqui o seu modelo
agora ta trivial o seu modelo
deve funcionar
 
estou jogando em uma aplicação console só essa parte para ver se vai..
 
pois eh fiz isso também
apesar que mudei
é verdade desculpa eu mudei
esqueci de falar
[Table("Departamento")]
public class Departamento
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int DepartamentoId { get; set; }

[Required]
[StringLength(50)]
public string Descricao { get; set; }

[ForeignKey("DepartamentoId")]
public virtual ICollection<Assunto> Assuntos { get; set; }
public Departamento()
{
this.Assuntos = new HashSet<Assunto>();
}
}

[Table("Assunto")]
public class Assunto
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int AssuntoId { get; set; }
dá uma olhada!
 
3:18 PM
certo, na aplicação separada deu funcionou.
Agora, porque esse erro na minha aplicação, não sei..
fora que tive que recriar a aplicação separada para testar porque a primeira estava com problemas.. estranho.
Vou remover as dependencias do entity framework, remover o migrations. Adicionar novamente e ver se funciona.
 
tiago.
vou te dar uma dica
que eu mesmo utilizo.
se quiser!
 
diga
 
eu dificilmente em um projeto novo vou trabalhar com codefirst
seu eu tiver opção de fazer na base e transpor isso para o entity é melhor
ou seja,
criar o banco e mandar o entity gerar o code first da base
simplesmente gera perfeito e elimina esses problemas
eu não gosto muito de codefirst
 
sim.. entendo
 
tem hora que impacta
 
3:21 PM
a filosofia do code-first é bonita, mas na prática, tem hora que dá dor de cabeça.. rs
principalmente para alguém sem domínio, como eu.
 
eu acredito você ser bem capaz!
mas, é normal
até eu impaquei
então sinceridade eu faço sempre o banco
em alguns casos eu utilizo mas, ai vem para mim um layout na 3 fN do banco
ai eu não tenho problemas
mas, o que você quer fazer por exemplo ele ta dando chave circular
ou seja, tanto assunto e departamento estão apontando para a mesma chave
vai dar problema mesmo
por exemplo Tiago se fosse fazer em um base como seria?
 
sim, uma tabela Departamento ( Id como Pk, e Descricao NotNull ), uma tabel como Assunto ( Id como Pk, Descricao NotNull, DepartamentoId como ForeignKey de Departamento )
 
o texto de código que te passei faz isso.
 
É, quer ir não.. ô loco.. vou remover essas duas classes, gerar o banco, adicionar as duas tabelas na mão e fazer um reverso
 
é
eu prefiro...
sinceramente
mas, é bom sempre saber do migrations neh não abandonar porque um dia quem sabe vai precisar!
mas, se puder ter a escolha sempre gere pelo banco.
 
3:27 PM
boa
 
bom precisando!
a sua pergunta lá vai ficar sem resposta
se quiser excluir sei lá!
ou deixar lá quem sabe !
 
precisaria que você removesse sua resposta para eu excluí-la
Opa, não precisou
blz
obrigado!
 
que isso sempre ai
precisando
vamos difundir C# e Entity!
vlw
obrigada!
 

last day (14 days later) »