簡體   English   中英

如何使用Entity Framework刪除相關字段

[英]How to delete related fields using 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);
        }

}

最后我試圖像這樣刪除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 \\“。沖突發生在database \\”myobject \\“,table \\”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與相應的列名稱不同,則應更改它們,以便它們彼此匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM