【问题标题】:Delete List of entities of the same entity on update更新时删除同一实体的实体列表
【发布时间】:2018-10-30 17:55:06
【问题描述】:

大家好,我找不到解决此问题的方法,我有一个实体,它在DbModelBuilder 上创建了这样的属性

首先是一个具有属性RelatedFoo 的类,它是同一个 Foo 实体的列表

public class Foo
    {
        public int FooId { get; set; }
        public string Name { get; set; }

        public virtual List<Foo> RelatedFoo { get; set; }
    }

这是在DbContext创建的

modelBuilder.Entity<Foo>()
        .HasMany(p => p.RelatedFoo)
        .WithMany()
        .Map(m =>
        {
            m.MapLeftKey("FooId");
            m.MapRightKey("RelatedFooId");
            m.ToTable("RelatedFoos");                
        });

这次迁移的结果是这样的

CreateTable(
            "dbo.RelatedFoos",
            c => new
                {
                    FooId= c.Int(nullable: false),
                    RelatedFooId= c.Int(nullable: false),
                })
            .PrimaryKey(t => new { t.FooId, t.RelatedFooId })
            .ForeignKey("dbo.Foo", t => t.FooId)
            .ForeignKey("dbo.Foo", t => t.RelatedFooId )
            .Index(t => t.FooId)
            .Index(t => t.RelatedFooId );

一切都按预期进行,我可以这样做:

//Create new list of relatedFoos        
List<Foo> relatedFoos = new List<Foo>();
//Add Foo entities to this list
relatedFoos.Add(fooEntity1);
relatedFoos.Add(fooEntity2);
//Add this List to a main Foo entity
Foo mainFooEntity.RelatedFoo = relatedFoos;
//Save this
db.Entry(mainFooEntity).State = EntityState.Modified;
db.SaveChanges();

并且relatedFoos 保存在新表中(RelatedFoos

当我尝试删除这个relatedFoos时,问题就来了……我已经尝试过了:

//Starting from a main Foo Entity
mainFooEntity.RelatedFoo = null;
db.Entry(mainFooEntity).State = EntityState.Modified;
db.SaveChanges();

这不会删除“RelatedFoos”的数据,也不会将mainFooEntity.RelatedFoo 分配给空的List&lt;Foo&gt; 或删除当前数据。我怎样才能删除这个List&lt;&gt;

【问题讨论】:

  • 当你从 db 获取 mainFooEntity 时,是否有可能因为延迟加载,列表已经为空?
  • 在阅读 mainFooEntity 时感谢@roozbeh,我确认已填充了相关Foo,在模型上被声明为虚拟属性,因此始终被填充。我找不到如何删除相关列表... :(
  • 感谢@crunchy,在这种情况下,当我删除主体实体时生效mainFooEntity。

标签: c# entity-framework collections ef-model-builder


【解决方案1】:

我找不到解决方案,所以我最终自己创建了一个新实体“RelatedFoos”,但没有 modelBuilder,这个新实体只是一个关系表,用于创建“Foo”与“Foo”N 关系。

我创建模型并添加到 DbContext,创建迁移,因此,通过这种方式,我可以使用此模型类进行更新或删除而不会出现问题。

提前致谢。

【讨论】:

    猜你喜欢
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    相关资源
    最近更新 更多