Невозможно сначала создать правильную таблицу, используя код - PullRequest
0 голосов
/ 08 октября 2019

У меня возникли серьезные проблемы при попытке сначала создать таблицу с использованием кода. Вот что у меня есть:

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()

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Можете ли вы изменить FuncionarioPagante, чтобы иметь значение NULL для EmpresaId

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; }
}
0 голосов
/ 08 октября 2019

Вероятно, потому что состояние Пессоа также меняется на «добавлено». Удалите строку

Pessoa = pessoaUnidade.Pessoa,

и установите только идентификатор. Это должно позволить сохранить его правильно.

Ваш граф объектов делает его похожим на все объекты, которые являются новыми. В качестве альтернативы вы могли бы явно установить сущность Pessoa в состояние объекта «немодифицированный».

Чтобы убедиться в этом, перед сохранением ошибок вы должны сделать что-то вроде (не скомпилировать, но это близко). ..

var tmpState = _contexto.Entity<Pessoa>(pessoaUnidade.Pessoa).ObjectState;
//look at value of tmpState. it likely says "added" and you want it to be "unmodified"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...