使用EF添加新的并将现有对象更新为多对多表

时间:2012-09-07 10:10:19

标签: c# sql-server linq entity-framework many-to-many

class A
{
    int Id; //Primary key
    string Name;
}

class B
{
    int Id; //Primary key
    string Name;
}

class AB
{
    int Id; //PK
    int AId; //FK
    int BId; //FK
}

在这种情况下: 数据库中存在“A” “B”和“AB”是新创建的对象。

A a = new A("asd");
B b = new B("qwe");
AB ab = new AB(1, 1);

我应该如何将这个实体框架添加到数据库?

是这样的吗?每个实体应该是3个上下文?

mydb.A.Context.ApplyCurrentValues(a)
mydb.B.Context.AddObject(b)
mydb.AB.Context.AddObject(ab) //connected with A and B above

2 个答案:

答案 0 :(得分:2)

在数据库第一种方法中,首先,实体AB不必要地将主键作为其关联实体。除非你想在该表上保留其他属性,否则不需要Pk,这将导致EF 4创建一个单独的实体。

Db关系图:

enter image description here

EF edmx结果:

enter image description here

使用该关系回答您的问题。

    public void addNewBtoA(B newEntity, A existingEntity) {

        _myContext.Attach(existingEntity);
        existingEntity.B.Add(newEntity);
        myContext.SaveChanges();

    }

编辑:

在Db中,EF会自动为多对多关系创建AB记录。

编辑2:

如果实体AB上有其他属性,那么EF会将其作为一个单独的实体导入,更新上下文会像这样求和:

B b = new B {
    Name = "name"
};

AB ab = new AB {

    A = existingA,
    B = b,
    arbitraryProp = "my heart is a fist of blood" 

}

_myContext.Attach(existingA);
_myContext.Add(b);
_myContext.Add(ab);
_myContext.SaveChanges();

添加的顺序无关紧要,因为EF根据.edmx中定义的模型关系确定插入顺序。请注意,只有在existingA当前未跟踪existingA时才需要附加_myContext - 即如果existingA使用_myContext.A.SingleOrDefault()获取,那么它已经附加了public void testab() { A existingA = new A { Name = "test a" }; using (ABEntities context = new ABEntities()) { context.A.AddObject(existingA); context.SaveChanges(); } using (ABEntities context = new ABEntities()) { B newB = new B { Name = "test b" }; context.Attach(existingA); existingA.B.Add(newB); context.SaveChanges(); } }

编辑3:

{{1}}

答案 1 :(得分:0)

您需要修改AB类定义,如下所示

class AB
{
    public int Id { get; set; }
    public virtual A A { get; set; }
    public virtual B B { get; set; }
}

然后

AB ab = new AB { A = a, B = b };

// if 'a' is not attached call mydb.A.Attach(a);
mydb.AB.AddObject(ab);

EF将确定实体的插入顺序。