如何使用Entity Framework删除相关字段

时间:2017-03-10 06:57:53

标签: c# entity-framework

我有一个这样的对象:

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;}

例外是非常明确的,但我不知道如何安全地删除这些对象。我感谢任何帮助。提前谢谢。

1 个答案:

答案 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与您应更改的相应列名称不同,则它们会相互匹配。