Мой следующий вопрос касается Entity Framework Core 2 (db - sql server) и наличия сущностей с одинаковым типом «один к одному» и «один ко многим».
У меня есть эти 2 сущности:
Тема:
public class Topic
{
[Key]
public int TopicID { get; set; }
public int MessageID { get; set; }
[ForeignKey("MessageID")]
public Message Message { get; set; }
public IEnumerable<Message> Messages { get; set; }
}
Сообщение:
public class Message
{
[Key]
public int MessageID { get; set; }
public int TopicID { get; set; }
public Topic Topic { get; set; }
public string Content { get; set; }
}
И я настроил их в моем контексте так:
builder.Entity<Topic>().HasKey(t => new { t.TopicID });
builder.Entity<Topic>()
.HasOne(t => t.Message);
builder.Entity<Topic>()
.HasMany(t => t.Messages)
.WithOne(m => m.Topic);
builder.Entity<Message>().HasKey(m => new { m.MessageID });
builder.Entity<Message>()
.HasOne(m => m.Topic)
.WithMany(t => t.Messages);
ИтакУ меня есть отношения «один-к-одному» и «один-ко-многим» одного и того же типа сущности:
- в теме есть 1 основное сообщение и список сообщений (которые являются ответами).
Когда я пытаюсь создать новую тему, подобную этой:
Message newMessage = new Message()
{
Content = content
};
Topic newTopic = new Topic()
{
Message = newMessage,
};
context.Topics.Add(newTopic);
context.SaveChanges();
- тема создается с допустимым идентификатором themeId
- сообщение создается сдействительный идентификатор сообщения
- тема получает новый идентификатор сообщения
- , но сообщение не получает новый идентификатор темы, вместо этого имеет значение 0
Итак, я попытался создать новую тему и сообщение, например:
Message newMessage = new Message()
{
Content = content
};
Topic newTopic = new Topic()
{
Message = newMessage,
Messages = new List<Message>() { newMessage }
};
context.Topics.Add(newTopic);
context.SaveChanges();
Но затем я получил следующее исключение:
ошибка: Microsoft.EntityFrameworkCore.Update [10000] Исключительная ситуация в базе данных при сохранении изменений для типа контекста «MyContext».System.InvalidOperationException: Невозможно сохранить изменения, поскольку в данных, подлежащих сохранению, обнаружена циклическая зависимость: 'ForeignKey: Message {' TopicID '} -> Topic {' TopicID '} ToDependent: Messages ToPrincipal: Topic, ForeignKey: Topic {'MessageID '} -> Message {' MessageID '} ToPrincipal: Message'.в Microsoft.EntityFrameworkCore.Internal.Multigraph'2.BatchingTopologicalSort (Func'2 formatCycle) в Microsoft.EntityFrameworkCore.Update.Internal.CommandBatchPreparer.TopologicalSort (команды IEnumerable'1) в Microsoft.EntityFrameworkr.Ine.TeventMateCate.Pove() в Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute (параметры Tuple'2) в Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerExecutionStrategy.Execute [TState, TResult] (состояние TState, функция Func'3, проверка функции Funce'3)) в Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute (IEnumerable'1 commandBatches, соединение IRelationalConnection) в Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges (записи IReadOnlyList'1 .Иhan.Exchange.EcanEE(IReadOnlyList'1 recordsToSave) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges (Boolean acceptAllChangesOnSuccess) at Microsoft.EntityFrameworkCore.DbContext.SaveChanges (Boolean acceptAllChangesOnSuccess)
Что я делаю не так?
Как создать в одной связи с БД тему и сообщение с помощьюправильные внешние ключи друг друга?