У меня возникли серьезные проблемы при попытке сначала создать таблицу с использованием кода. Вот что у меня есть:
public class Pessoa
{
[Key]
public int PessoaId { get; set; }
public virtual Empresa Empresa { get; set; }
...
}
public class Empresa
{
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public int EmpresaId { get; set; }
public virtual List<FuncionarioFree> FuncionarioFree { get; set; }
public virtual List<FuncionarioPagante> FuncionarioPagante { get; set; }
[Key,ForeignKey("Pessoa")]
public int PessoaId { get; set; }
[Required]
public virtual Pessoa Pessoa { get; set; }
...
}
public class FuncionarioPagante
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int FuncionarioPaganteId { get; set; }
public int PessoaId { get; set; }
[ForeignKey("PessoaId")]
public virtual Pessoa Pessoa { get; set; }
public int EmpresaId { get; set; }
[ForeignKey("EmpresaId")]
public virtual Empresa Empresa { get; set; }
}
Теперь для того, что мне нужно:
Pessoa
может иметь или не иметь Empresa
(компания). И Empresa
имеет список FuncionarioPagante
(сотрудников).
Теперь, когда я пытаюсь вставить новый FuncionarioPagante
:
var novoFuncionario = new FuncionarioPagante()
{
EmpresaId = empresaId,
Pessoa = pessoaUnidade.Pessoa,
PessoaId = pessoaUnidade.PessoaId
};
_contexto.FuncionarioPagante.Add(novoFuncionario);
_contexto.SaveChanges();
Выдает эту ошибку: (Примечание: в этом случае Pessoa
и Empresa
уже существуют в БД)
"Оператор INSERT конфликтует с ограничением FOREIGN KEY \" FK_dbo.FuncionarioFree_dbo.Empresa_EmpresaId \ ". Конфликтпроизошла в базе данных \ "...", таблица \ "dbo.Empresa \", столбец "PessoaId". \ r \ nОтчет был прерван. "
EDIT Я сделал еще несколько тестов, и это работает, когда я пытаюсь вставить новый FuncionarioPagante с Pessoa, у которого есть Empresa. Но это не имеет смысла для меня. Pessoa, который я вставляю, не должен был иметь Empresa, чтобы быть вставленным в список FuncionarioPagante в Empresa кого-то другого.
EDIT 2: Когда я вставляю егос Empresa это работает также, как это:
var empresa = _contexto.Empresa.Where(x => x.EmpresaId == empresaId).FirstOrDefault();
var novoFuncionario = new FuncionarioPagante()
{
EmpresaId = empresaId,
Pessoa = pessoaUnidade.Pessoa,
Empresa = empresa,
PessoaId = pessoaUnidade.PessoaId
};
Но значение, вставленное в EmpresaId, изменяется на значение PessoaId владельца Empresa после SaveChanges()