【发布时间】:2012-08-10 00:23:44
【问题描述】:
我遇到了异常
已检测到关系 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 个 FK,一个到 MyEntity,一个到另一个实体 Detail。
在有问题的场景中,MyEntity 是新的具有新的详细信息。我期待 MyEntity 的新条目具有新的详细信息并正确设置所有 FK。
编辑:
这是插入:
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);
}
【问题讨论】:
-
您的数据库集在哪里声明?
-
在继承 DbContext 的 DatabaseContext 类中。
-
你能显示导致异常的代码吗? (我想知道“MyEntity 有一个新的 Detail”是什么意思,尽管 MyEntity 在您显示的模型中没有 Detail 属性。)
-
当您的对象图不一致时会发生这种情况 - 例如,实体 A 在导航属性中引用了 B,但 B 上的反向导航属性不包含对 A 的引用。您是否对方式进行了任何更改EF 如何检测变化?
-
我添加了一些插入完成的代码。 A 和 B 不知道彼此的唯一参考是“PropertyOneToOne”(请参阅新代码)。只有 MyEntity 知道它。但是,添加的使一切都失败的新代码仅涉及添加属性“组”这就是为什么我怀疑更多的“组”属性配置是错误的。
标签: c# asp.net-mvc entity-framework entity-framework-4.1 ef-code-first