Код Entity Framework в первую очередь - PullRequest
1 голос
/ 01 ноября 2011

Мои классы сущностей выглядят так:

public class A{  
  [Key]  
  string Name; 
  B DefaultB;  
  ICollection<B> Bs;  
}

public class B{  
  [Key]
  int Key;
}

public class C{  
  [Key]  
  string Key; 
  A MyA;
  B MyB;  

  public C(A a,B b){  
    MyA=a;  
    MyB=b;
  } 
}  

public class MyDbContext:DbContext{  
  public DbSet<A> As
  public DbSet<B> Bs
  public DbSet<C> Cs
}  

Код тестирования выглядит так:

main(){
  A a=new A();  
  B b=new B();  
  a.addB(B);  
  MyDbContext m=new MyDbContext();  
  m.As.Add(a);  
  m.SaveChanges();
  C c=new C(a,b);
  m.Cs.Add(c);
  m.SaveChanges();
}

Проблема в том, что когда я добавляю c в контекст, он пытаетсяснова добавьте a и b в контекст, что вызывает исключение, потому что они уже в нем.Этого не должно быть.

Как мне это решить?

Спасибо

1 Ответ

0 голосов
/ 01 ноября 2011

Если вы делаете все это в одном контексте, вам нужен только один SaveChanges в конце:

A a=new A();  
B b=new B();  
a.addB(B);

using (MyDbContext m = new MyDbContext())
{
   m.As.Add(a);  

   C c=new C(a,b);
   m.Cs.Add(c);

   m.SaveChanges();
}

EF создаст только один A и один B и используети в отношениях в b и в c.

Если вам нужно - по какой-то причине - создать два контекста, вы должны заново присоединить объекты, вставленные в первый контекст, чтобы избежать повторной вставки и дублированияв базе данных:

A a=new A();  
B b=new B();  
a.addB(B);

using (MyDbContext m = new MyDbContext())
{
   m.As.Add(a);  
   m.SaveChanges();
}

// ...

using (MyDbContext m2 = new MyDbContext())
{
   m2.As.Attach(a);
   m2.Bs.Attach(b);

   C c=new C(a,b);
   m2.Cs.Add(c);

   m2.SaveChanges();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...