C# ef核心中相同类型的一对一和一对多关系
我的下一个问题是关于EntityFrameworkCore2(db-SQLServer)以及具有一对一和一对多相同类型的实体 我有以下两个实体: 主题: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
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个连接吗?