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
答案 0 :(得分:2)
在数据库第一种方法中,首先,实体AB不必要地将主键作为其关联实体。除非你想在该表上保留其他属性,否则不需要Pk,这将导致EF 4创建一个单独的实体。
Db关系图:
EF edmx结果:
使用该关系回答您的问题。
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将确定实体的插入顺序。