Uma classe Endereco está marcada como @Embeddable e seu atributo como @Embedded em outra classe. Dessa forma ela compartilha a mesma PK (Primary Key) da tabela inserido, ou seja, tudo fica na mesma tabela.
Gostaria de saber o equivalente a essa anotação emC#?
Edição:
An unhandled exception of type ‘System.InvalidOperationException’ occurred in EntityFramework.dll
Additional information: Unable to determine the principal end of an association between the types ‘Entidades.Endereco’ and ‘Entidades.Pessoa’. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.
Encontrei uma solução que foi comentar essas propriedades:
[Key]
public int IdPessoa { get; set; }
[ForeignKey("IdPessoa")]
public virtual Pessoa Pessoa { get; set; }
Caro @filipecampos, tudo vai depender de qual ORM você utiliza, mas, dando um exemplo, no Entity Framework é Key e na outra também é Key, só que na segunda chave não pode gerar dado para auto incremento pegando em si da relação que é formada de 1:1.
Exemplo:
Class Pessoa
public class Pessoa
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id {get;set;}
[Required]
public string Nome {get;set;}
public virtual Endereco Endereco {get;set;}
}
Class Endereco
public class Endereco
{
[Key]
public int PessoaId {get;set;}
[ForeignKey("PessoaId")]
public virtual Pessoa Pessoa {get;set;}
[Required]
public string Logradouro {get;set;}
[Required]
public string Cidade {get;set;}
}
Nesse caso especifico é apenas para ORM Entity Framework, se for outro ORM deverá especificar melhor na sua questão para sabe o que deseja fazer!
Meu caro, primeiramente obrigado pela resposta porém na prática não funcionou muito bem.
Tentei primeiro fazendo da minha cabeça mas com nao tive sucesso copiei e colei seu código.
Veja a exceção lançada no final da pergunta
Meu caro, com sua edição muda algumas coisas: No modo 1:1 no ORM Entity Framework existem possibilidades, mas, pelo que eu entendi é um relacionamento 1 para 1 com agregação de uma delas, segue exemplo completo e funcional:
Classe Aluno
[Table("Alunos")]
public class Aluno
{
public Aluno()
{
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int AlunoId { get; set; }
[Required]
[MaxLength(50)]
public string Nome { get; set; }
[ForeignKey("AlunoId")]
public virtual Endereco Endereco { get; set; }
}
Classe Endereco
[Table("Enderecos")]
public class Endereco
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int AlunoId { get; set; }
[Required]
[MaxLength(50)]
public string Rua { get; set; }
[Required]
[MaxLength(20)]
public string Numero { get; set; }
[Required,ForeignKey("AlunoId")]
public virtual Aluno Aluno { get; set; }
}
Classe Endereco depende da classe Aluno aonde o relacionamento é 1:1 ou 1:0, ou seja, para que Endereco funcione tem que existir Aluno.
Classe Database que herda de DbContext do ORM EntityFramework 6.3.1
public class Database: DbContext
{
public Database()
:base("conn")
{
}
public DbSet<Aluno> Alunos { get; set; }
public DbSet<Endereco> Enderecos { get; set; }
}
Como gravar:
using (Database db = new Database())
{
Aluno aluno = new Aluno();
aluno.Nome = "Guj";
aluno.Endereco = new Endereco();
aluno.Endereco.Numero = "Rua dos Guj";
aluno.Endereco.Rua = "s/n";
aluno.Endereco.Aluno = aluno;
db.Alunos.Add(aluno);
db.SaveChanges();
}
As outras operações são parecidas, só tome cuidado na hora da edição não setar nada no endereço se ele contiver na sua base, se ele for igual a null (que é o caso especifico do cadastro) tem que jogar uma instância e preencher passando a relação.