У меня есть две таблицы, для аргумента давайте назовем их Profile
и Session
. Profile
имеет текущий активный сеанс (необязательно), и все сеансы должны быть связаны с профилем (даже те, которые не активны).
Итак, мы имеем отношение 1 к 1 между Session
и Profile
на CurrentSessionId
, а также отношение 1 к многим между Profile
и Session
.
Вопрос в том, как создать это в коде Entity Framework в первую очередь?
У меня есть две сущности
public class Profile
{
public Guid Id { get; set; }
public Session CurrentSession { get; set; }
}
public class Session
{
public Guid Id { get; set; }
}
и две конфигурации типа
public class ProfileTypeConfiguration : IEntityTypeConfiguration<Profile>
{
public void Configure(EntityTypeBuilder<Profile> builder)
{
builder.ToTable("Profile");
builder.HasKey(x => x.Id);
builder.HasOne(x => x.CurrentSession)
.WithOne()
.HasForeignKey<Profile>("CurrentSessionId")
.HasConstraintName("FK_CurrentSession_Profile")
.IsRequired(false);
}
}
public class SessionTypeConfiguration : IEntityTypeConfiguration<Session>
{
public void Configure(EntityTypeBuilder<Session> builder)
{
builder.ToTable("Session");
builder.HasKey(x => x.Id);
builder.HasOne<Profile>()
.WithMany()
.HasForeignKey("ProfileId")
.HasConstraintName("FK_Profile_CurrentSession")
.IsRequired();
}
}
Все это генерирует схему базы данных, как ожидается, с правильными столбцами и внешними ключами. Проблема возникает, когда я пытаюсь вставить профиль в базу данных
var profile = new Profile
{
Id = Guid.NewGuid(),
CurrentSession = new Session
{
Id = Guid.NewGuid()
}
};
ctx.Profiles.Add(profile);
ctx.SaveChanges();
В этот момент я получаю SqlException
высказывание
Оператор INSERT конфликтовал с ограничением FOREIGN KEY "FK_Profile_CurrentSession"
При просмотре в профилировщике вставка не включает запись Profile
и пытается только вставить Session
exec sp_executesql N'SET NOCOUNT ON;
INSERT INTO [Session] ([Id], [ProfileId])
VALUES (@p0, @p1);
',N'@p0 uniqueidentifier,@p1 uniqueidentifier',@p0='AE96BD5F-FB0D-4E02-8E97-FBEFE4EF1382',@p1='00000000-0000-0000-0000-000000000000'
Возможно ли то, что я пытаюсь сделать? Должно ли оно быть определено по-другому?
- EF Core версия: 2.2.1
- Поставщик базы данных: Microsoft.EntityFrameworkCore.SqlServer
- Операционная система: Windows 10