Как сделать авто заполнение Foreign Key в Entity Framework?
public class MSDBcontext : DbContext
{
public MSDBcontext(DbContextOptions<MSDBcontext> options)
: base(options)
{
}
public DbSet<Mails> Mails { get; set; }
public DbSet<MailsResult> MailsResults { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Mails>()
.HasOne(b => b.MailsResult)
.WithOne(i => i.Mails)
.HasForeignKey<MailsResult>(b => b.MailsId);
}
}
public class Mails
{
public int MailsId { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
public string Recipient { get; set; }
public MailsResult MailsResult { get; set; }
}
public class MailsResult
{
public int MailsResultId { get; set; }
public DateTime CreatedDate { get; set; }
public string Result { get; set; }
public string FailedMessage { get; set; }
public int MailsId { get; set; }
public Mails Mails { get; set; }
}
[HttpPost]
public async Task<ActionResult<Mails>> PostMails(Mails mails)
{
MailsResult result = new MailsResult();
result.MailsId = mails.MailsId;
result.CreatedDate = DateTime.Now;
result.Result = "OK";
result.FailedMessage = null;
_context.Mails.Add(mails);
_context.MailsResults.Add(result);
await _context.SaveChangesAsync();
return CreatedAtAction("GetMails", new { id = mails.MailsId }, mails);
}
У меня в базе связь один к одному, как мне сделать автозаполнение внешнего ключа в таблице MailResult? Я получается заполняю MailResult данными об ошибка связанных с сообщением которое пришло Mails. И поэтому Внешний ключ должен совпадать с id Mails.
Вот такое решение я придумал, но у меня большие сомнения в том что оно правильное:
_context.Mails.Add(mails);
await _context.SaveChangesAsync();
result.MailsId = new { id = mails.Id }.id;
result.CreatedDate = DateTime.Now;
result.Result = "OK";
result.FailedMessage = "OK";
_context.MailsResults.Add(result);
await _context.SaveChangesAsync();
Ответы (1 шт):
Автор решения: Alexander Petrov
→ Ссылка
Итак, третья редакция ответа.
Судя по добавленному куску кода, mails - это новая сущность, ещё не существующая в БД.
MailsResult result = new MailsResult { CreatedDate = DateTime.Now, Result = "OK" };
mails.MailsResult = result; // <--
_context.Mails.Add(mails);
_context.MailsResults.Add(result);
await _context.SaveChangesAsync();
Не используйте свойства-ключи напрямую. Используйте навигационные свойства. EF сам задаст необходимые ключи.