我遇到了异常:
检测到关系y的角色x存在冲突更改。
每次我将我的实体添加到上下文中
Database.MyEntitys.Add(MyEntity);
MyEntity类包含以下属性:
public virtual ICollection<DetailInfo> Group { get; set; }
DetailInfo类非常简单:
public class DetailInfo:BaseEntity {
public virtual Detail Detail { get; set; }
public decimal Total { get; set; }
public virtual MyEntity MyEntity { get; set; }
}
DatabaseContext 也很简单:
public class MyEntityConfiguration : EntityTypeConfiguration<MyEntity> {
public MyEntityConfiguration() {
HasMany(e => e.Group).WithRequired(s => s.MyEntity).WillCascadeOnDelete(true);
}
}
public class DetailInfoConfiguration : EntityTypeConfiguration<DetailInfo> {
public DetailInfoConfiguration() {
HasRequired(x => x.MyEntity).WithMany(s => s.Group);
HasRequired(x => x.Detail);
HasKey(s => s.ID);
ToTable("DetailInfo");
}
}
在数据库方面,表格MyEntity有一个指向列ID的主键。DetailInfo也有一个名为ID的主键。DetailInfo包含2个外键,一个指向MyEntity,另一个指向另一个实体Detail。
在存在问题的情况下,MyEntity是新的并且有一个新的Detail。我期望会有一个新的MyEntity条目,其中包含一个新的Detail,并且所有外键都正确设置。
编辑:
这里是插入操作:
public virtual int Insert(MyEntity myEntity) {
if (myEntity.Group != null && myEntity.Group.Count() == 0) {
myEntity.Group = null;
}
if (myEntity.Group != null) {
foreach (var g in myEntity.Group)
{
if (g.PropertyOneToOne != null) {
if (g.PropertyOneToOne.ID == 0) {
myEntity.PropertyOneToOne = null;
}
else {
if (!Database.PropertyOneToOnes.Local.Any(e => e.ID == g.PropertyOneToOne.ID)) {
Database.PropertyOneToOnes.Attach(g.PropertyOneToOne);
}
myEntity.PropertyOneToOne = Database.PropertyOneToOnes.Local.Single(e => e.ID == g.PropertyOneToOne.ID);
}
}
else {
myEntity.PropertyOneToOne = null;
}
}
}
Database.MyEntitys.Add(myEntity);
}
HasRequired(x => x.Detail);
更改为HasRequired(x => x.Detail).WithRequiredPrincipal();
,但没有成功。我认为 WithRequiredPrincipal 应该使导航的一侧工作,但似乎并不是这样。 - Patrick Desjardins