我有一个这样的对象:
public class MyObject
{
[Key]
public int Id { get; set; }
public string ExternalNumber { get; set; }
public virtual InternalProperties InProperties { get; set; }
public virtual ICollection<AdditionalPrice> PriceHistory{ get; set; }
}
和InternalProperties类:
public class InternalProperties
{
[Key]
public int Id { get; set; }
public string Field1{get; set;}
}
和PriceHistory:
public class AdditionalPrice
{
[Key]
public int Id { get; set; }
public double? Price { get; set; }
}
我的上下文看起来像这样:
public class myContext : DbContext
{
static myContext ()
{
Database.SetInitializer<myContext >(null);
}
public myContext ()
: base("myCtx")
{
}
public DbSet<MyObject> Objects{ get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<myObject>().HasOptional(m => m.InProperties );
modelBuilder.Entity<myObject>().HasMany(m => m.PriceHistory);
}
}
最后,我试图删除像这样的myObject:
using (var _sdb = new MyContext())
{
_sdb.Configuration.AutoDetectChangesEnabled = false;
var myList = _sdb.Objects.Where(m => m.Id > 5).OrderBy(c => c.Id).ToList();
foreach(var obj in myList)
{
_sdb.Objects.Remove(obj)
}
}
_sdb.SaveChanges();
我在SaveChanges()中收到此异常:
{&#34;保存不公开外来实体的实体时发生错误 他们关系的关键属性。 EntityEntries属性 将返回null,因为无法将单个实体标识为 异常的来源。保存时可以处理异常 通过在实体类型中公开外键属性使其变得更容易。 有关详细信息,请参阅InnerException。&#34;}
内部异常说:
{&#34; DELETE语句与REFERENCE约束冲突 \&#34; FK_dbo.AdditionalPrice_dbo.MyObject_MyObject_Id \&#34 ;.冲突 发生在数据库\&#34; myobject \&#34;,table \&#34; dbo.AdditionalPrice \&#34;, 列&#39; myObject_Id&#39;。\ r \ n语句已终止。&#34;}
例外是非常明确的,但我不知道如何安全地删除这些对象。我感谢任何帮助。提前谢谢。
答案 0 :(得分:2)
我认为你需要这样的东西:
var pricesToBeDeleted = _sdb.AdditionalPrices.Where(ap=>ap.MyObjectId == obj.Id);
_sdb.AdditionalPrices.Remove(pricesToBeDeleted);
_sdb.Objects.Remove(obj)
AdditionalPrices
的类型为DbSet<AdditionalPrice>
。您应该在myContext
类中添加以下行:
public DbSet<AdditionalPrice> Objects{ get; set; }
关于AdditionalPrice
类,我没有看到MyObject
的外键。我想你错过了那里的东西。我的意思是你可能会有以下内容:
public class AdditionalPrice
{
[Key]
public int Id { get; set; }
public double? Price { get; set; }
public int MyObjectId { get; set; }
}
其中MyObjectId
是外键。如果名称MyObjectId
与您应更改的相应列名称不同,则它们会相互匹配。