0
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);

我应该如何将它与 Entity Framework 添加到数据库中?

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

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

2 回答 2

2

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

Db关系图:

在此处输入图像描述

EF edmx 结果:

在此处输入图像描述

使用这种关系来回答您的问题。

    public void addNewBtoA(B newEntity, A existingEntity) {

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

    }

编辑:

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

编辑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_myContextexistingA_myContext.A.SingleOrDefault()

编辑 3:

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();
            }
        }
于 2012-09-07T11:02:43.730 回答
0

You need modify your AB class definition as follows

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

Then

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

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

EF will figure out the insertion order of the entities.

于 2012-09-07T11:01:35.280 回答