【发布时间】:2017-02-25 15:44:28
【问题描述】:
请考虑以下实体
public class What {
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Track> Tracks { get; set; }
public int? LastTrackId { get; set; }]
public Track LastTrack { get; set; }
}
public class Track {
public Track(string what, DateTime dt, TrackThatGeoposition pos) {
What = new What { Name = what, LastTrack = this };
}
public int Id { get; set; }
public int WhatId { get; set; }
public What What { get; set; }
}
我使用以下配置实体:
builder.HasKey(x => x.Id);
builder.HasMany(x => x.Tracks).
WithOne(y => y.What).HasForeignKey(y => y.WhatId);
builder.Property(x => x.Name).HasMaxLength(100);
builder.HasOne(x => x.LastTrack).
WithMany().HasForeignKey(x => x.LastTrackId);
你有没有看到需要循环引用:
What.LastTrack <-> Track.What
当我尝试将 Track 添加到上下文时(实际上是在 SaveChanges 上):
Track t = new Track("truc", Datetime.Now, pos);
ctx.Tracks.Add(t);
ctx.SaveChanges();
我收到以下错误:
无法保存更改,因为在要保存的数据中检测到循环依赖:''What' {'LastTrackId'} -> 'Track' {'Id'}, 'Track' {'WhatId'} -> '什么' {'Id'}'。
我想说...是的,我知道但是...
EF Core 可以进行这样的配置吗?
【问题讨论】:
-
请显示导致错误的代码。这可能是一个先有鸡还是先有蛋的问题(两个新对象需要彼此的外键)。
-
@GertArnold 就是这样。现在我通过两次提交来解决它。恐怕我没有保留确切的旧代码。
-
你确实需要两次提交,别无选择。您可能希望将它们包装在
TransactionScope中。 -
@GertArnold 允许回滚两个提交?
-
是的,这就是
TransactionScope的常用用途。
标签: entity-framework entity-framework-core