C# ef核心中相同类型的一对一和一对多关系

C# ef核心中相同类型的一对一和一对多关系,c#,sql-server,entity-framework-core,C#,Sql Server,Entity Framework Core,我的下一个问题是关于EntityFrameworkCore2(db-SQLServer)以及具有一对一和一对多相同类型的实体 我有以下两个实体: 主题: public class Topic { [Key] public int TopicID { get; set; } public int MessageID { get; set; } [ForeignKey("MessageID")] public Message Message { get; se

我的下一个问题是关于EntityFrameworkCore2(db-SQLServer)以及具有一对一和一对多相同类型的实体

我有以下两个实体:

主题:

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; }
}
我把它们放在我的环境中如下:

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);
Message newMessage = new Message()
{
    Content = content
};
Topic newTopic = new Topic()
{
    Message = newMessage,
};

context.Topics.Add(newTopic);
context.SaveChanges();
Message newMessage = new Message()
{
    Content = content
};
Topic newTopic = new Topic()
{
    Message = newMessage,
    Messages = new List<Message>() { newMessage }
};

context.Topics.Add(newTopic);
context.SaveChanges();
  • 使用有效的topicId创建主题
  • 使用有效的messageId创建消息
  • 主题获取新的messageId
  • 但是消息没有获得新的主题ID,而是设置为0
因此,我下一步要做的就是创建新的主题和消息,如下所示:

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);
Message newMessage = new Message()
{
    Content = content
};
Topic newTopic = new Topic()
{
    Message = newMessage,
};

context.Topics.Add(newTopic);
context.SaveChanges();
Message newMessage = new Message()
{
    Content = content
};
Topic newTopic = new Topic()
{
    Message = newMessage,
    Messages = new List<Message>() { newMessage }
};

context.Topics.Add(newTopic);
context.SaveChanges();
Message newMessage=newMessage()
{
内容=内容
};
主题newTopic=新主题()
{
Message=newMessage,
Messages=newlist(){newMessage}
};
context.Topics.Add(newTopic);
SaveChanges();
但随后我收到了以下例外情况:

失败:Microsoft.EntityFrameworkCore.Update[10000] 保存对上下文类型“MyContext”的更改时,数据库中发生异常。 System.InvalidOperationException:无法保存更改,因为在要保存的数据中检测到循环相关性: 'ForeignKey:Message{'TopicID'}->ToDependent主题{'TopicID'} Messages-ToPrincipal:Topic,ForeignKey:Topic{'MessageID'}-> 消息{'MessageID'}ToPrincipal:Message'。 位于Microsoft.EntityFrameworkCore.Internal.Multigraph'2.BatchingTopologicalSort(Func'2 格式周期) 位于Microsoft.EntityFrameworkCore.Update.Internal.CommandBatchPreparer.TopologicalSort(IEnumerable'1 (命令) 在Microsoft.EntityFrameworkCore.Update.Internal.CommandBatchPreparer.d_u8.MoveNext()中 位于Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(元组'2 参数) 在Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState)中 状态,Func'3操作,Func'3验证成功) 位于Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable'1 commandBatches,iRelational连接) 位于Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges(IReadOnlyList'1 参赛作品) 位于Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList'1 (保存) 位于Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(布尔值 可接受的变化(成功) 在Microsoft.EntityFrameworkCore.DbContext.SaveChanges(布尔值)中 可接受的变化(成功)

我做错了什么


如何在与db的一个连接中使用彼此的右外键创建主题和消息?

您必须将topic.MainMessage设置为可选,并在保存了topic.Messages()之后进行设置。

但是如果在context.SaveChanges()之后进行设置,则意味着需要两个连接才能创建新的主题和消息。有没有办法在一个连接中完成?只有一个连接。两个独立的命令。没有,没有其他方法(不删除或禁用外键)。Topic.main消息不是已经是可选的,除非我用IsRequired()设置它吗?除了可选之外,在保存主题时,它还必须实际为空。太好了,这很有效!关于你的评论说这是一个连接,我还有另一个问题:当我运行2 context.SaveChanges()时,它不会打开2个连接吗?