我有一个这样的对象:
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;}
}
和价格历史:
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);
}
}
最后,我试图像这样删除myObjects:
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()中收到此异常:
{“在保存不公开其关系的外键属性的实体时发生错误。EntityEntries属性将返回null,因为无法将单个实体标识为异常的来源。通过暴露可以使保存过程中的异常处理更容易实体类型中的外键属性。有关详细信息,请参见InnerException。“}
内部异常说:
{“ DELETE语句与REFERENCE约束\“ FK_dbo.AdditionalPrice_dbo.MyObject_MyObject_Id \”发生冲突。冲突发生在数据库“ myobject \”,表\“ dbo.AdditionalPrice \”的列'myObject_Id'中。\ r \ n该语句已终止。“}
例外是很好的解释,但是我不知道如何安全地删除这些对象。感谢您的帮助。提前致谢。
我认为您需要这样的东西:
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
与对应的列名称不同,则应更改它们以使它们彼此匹配。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句