防止EF保存完整对象图

时间:2017-09-25 09:45:46

标签: entity-framework object-graph

我有一个模型如下

public class Lesson
{

    public int Id { get; set; }
    public Section Div { get; set; }

}

public class Section
{

    public int Id { get; set; }

    public string Name { get; set; }
}

我也有DB Context,如下所示

public class MyContext : DbContext
{

    public MyContext() : base("DefaultConnection")
    {
        this.Configuration.LazyLoadingEnabled = false;
        this.Configuration.ProxyCreationEnabled = false;
    }

    public DbSet<Lesson> Lessons { get; set; }
    public DbSet<Section> Sections { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    }

}

然后我使用以下代码来调用数据库

            using (MyContext c = new EFTest.MyContext())
            {

                Lesson d = new EFTest.Lesson();
                Section ed = new EFTest.Section() { Name = "a" };
                d.Div = ed;

                c.Entry(d.Div).State = EntityState.Detached;

                c.Lessons.Add(d);
                c.SaveChanges();
            }

我希望这段代码只保存Lesson对象,而不是保存Lesson和Section的完整图形,但会发生的是保存完整的图形。 我该如何阻止它这样做?

1 个答案:

答案 0 :(得分:0)

当您向DbSet添加实体时,entityframework将添加其所有相对实体。在将父实体添加到DbSet之后,您需要分离您不想添加的实体。

using (MyContext c = new EFTest.MyContext())
{

    Lesson d = new EFTest.Lesson();
    Section ed = new EFTest.Section() { Name = "a" };
    d.Div = ed;

    c.Lessons.Add(d);

    c.Entry(d.Div).State = EntityState.Detached;

    c.SaveChanges();
}

如果要添加与课程相关的部分,则需要使用相同的上下文,或者创建新的上下文并加载课程。

您可以使用此代码

using (MyContext c = new EFTest.MyContext())
{

    Lesson d = new EFTest.Lesson();
    Section ed = new EFTest.Section() { Name = "a" };
    d.Div = ed;

    c.Lessons.Add(d);

    c.Entry(d.Div).State = EntityState.Detached;

    c.SaveChanges();

    //you can use this code
        ed.Lesson = d;
    // or this code
        d.Div = ed;

    c.Sections.Add(ed);
    c.SaveChanges();
}