отношения один-к-одному и один-ко-многим одного типа в ядре - PullRequest
0 голосов
/ 11 мая 2018

Мой следующий вопрос касается 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)

Что я делаю не так?

Как создать в одной связи с БД тему и сообщение с помощьюправильные внешние ключи друг друга?

1 Ответ

0 голосов
/ 11 мая 2018

Вы должны сделать Topic.MainMessage необязательным и установить его после того, как SaveChanges () отредактировал Topic.Messages.

...