문제

상위 엔터티가 있습니다.

foo DB에 존재하는 속성이 있습니다. bar 이 엔터티에 대해(일대다 관계).

Foo WebApi를 사용하여 역직렬화되었기 때문에 분리되었으므로 이렇게 합니다. foo

context.Foos.AddOrUpdate(foo);

새로운 것이 있어도 bar 참조가 첨부되어 있으면 저장되지 않지만 다대다 관계인 다른 관계에 대해서는 이와 같이 작동합니다.해당 컬렉션에 새 엔터티를 추가하면 테이블에 저장되고 관계 테이블에도 행이 추가됩니다.

만약 내가한다면 context.Bars.AddOrUpdate(foo.Bar); 전화하기 전에 context.Foos.AddOrUpdate(foo); 새 막대를 막대 테이블에 올바르게 저장하지만 foo 테이블에 올바른 barId를 추가하지 않습니다.

@율리암 찬드라

내가 귀하의 답변을 올바르게 이해했다면(귀하의 답변에 막대와 foos가 섞여 있는 것 같습니다) 이것이 작동해야 합니까?

var foo = new Foo();
foo.FooId = 524 //Existing foo;

foo.Bar = new Bar(); //Completely new bar    
db.Foos.AddOrUpdate(foo);
db.SaveChanges();

하지만 그렇지 않다

도움이 되었습니까?

해결책

연결이 끊긴 개체를 사용하려면 추가 코드가 필요합니다.

연결이 끊긴 객체로 작업하는 경우 동기화를 수동으로 관리해야합니다.

원천

만약에 Bar 먼저 연결해야 하는 기존 엔터티이므로 Foo 다음과 같이 추가됩니다. Bar's 어린이들.

if (foo.Bar.Id != 0)
{
    context.Bars.Attach(foo.Bar);
    context.Foos.AddOrUpdate(foo);
}

위 코드의 예는 다음과 유사합니다. Course (Foo) 그리고 Department (Bar)의 예 이 기사.

하지만 만약 Bar 추가하기만 하면 되는 새로운 엔터티입니다. Foo, 그 다음에 Bar 도 추가됩니다.

else
{
    context.Foos.Add(foo);
}

다른 품종도 확인 가능 내 대답.

업데이트

더 설명하기 전에 동일한 코드를 보여주고 싶습니다.

  • db.Set<T>().Add(instance) 같음 db.Entry(instance).State = EntityState.Added;
  • db.Set<T>().Attach(instance) 같음 db.Entry(instance).State = EntityState.Unchanged;

이전 답변에서는 두 가지 조건에 대해 설명했습니다.

  • 새로운 Foo 및 기존 Bar

    context.Bars.Attach(foo.Bar);

    context.Foos.AddOrUpdate(foo);

  • 뉴 푸(New Foo)와 뉴 바(Bar)

    context.Foos.Add(foo);

특별 추가

Added 엔터티가 다음으로 표시되면 특별한 조건이 있습니다. Added.그래프의 모든 엔터티는 다음과 같이 표시됩니다. Added 참조 엔터티가 데이터베이스의 기존 개체인 경우에도 마찬가지입니다.이 코드가 있으면 Foo와 Bar가 추가됩니다.

var foo = new Foo (); // new foo
foo.Bar = new Bar { BarId = 123 }; // existing bar
db.Set<Foo>().Add(foo);
db.SaveChanges();

이를 방지하려면 Bar를 먼저 부착해야 합니다.

var foo = new Foo (); // new foo
foo.Bar = new Bar { BarId = 123 }; // existing bar
db.Set<Bar>().Attach(bar);
db.Set<Foo>().Add(foo);
db.SaveChanges();

확인하다 줄리 레먼 기사 더 완전한 설명을 원하시면.

그 이유는 dbset.add 메소드 (즉, Screencasts.add)를 사용할 때 루트 엔티티의 상태가 "추가 된"것으로 표시 될뿐만 아니라 컨텍스트가 이전에 알지 못했던 그래프의 모든 내용이 표시되기 때문입니다. 표시되어 있습니다.개발자는이 주제에 기존 ID 값이 있음을 알고 있지만 엔티티 프레임 워크는 기존 ID에 관계없이 EntityState (추가)를 수유하고 주제에 대한 삽입 데이터베이스 명령을 작성합니다.

업데이트에 따라 설명을 조정하세요.

업데이트된 질문은 기존 Foo 및 새로운 Bar에 관한 것입니다.코드를 사용하면 결과에 새 Bar가 추가되지 않으며 기존 Foo는 새 Bar와 관계를 맺지 않습니다.

var foo = new Foo();
foo.FooId = 524 //Existing foo;

foo.Bar = new Bar(); //Completely new bar    
db.Foos.AddOrUpdate(foo);
db.SaveChanges();

Bar를 수동으로 추가하면 AddOrUpdate(foo), 결과는 여전히 예상과 다릅니다.새 Bar가 추가되지만 Foo는 새 Bar와 관계가 없습니다.

db.Bars.Add(foo.Bar);
db.Foos.AddOrUpdate(foo);

행동 AddOrUpdate 일관성이 없습니다.

해결책

연결이 끊긴 객체로 작업하는 경우 동기화를 수동으로 관리해야합니다.

이 코드는 모든 조건에서 작동해야 합니다.

  • 뉴푸와 뉴바
  • 새로운 Foo 및 기존 바
  • 기존 Foo 및 새 Bar
  • 기존 Foo 및 기존 Bar

이 코드는 ID에 따라 다릅니다(id = 0은 새 엔터티임).

db.Entry(foo).State = 
       foo.FooId == 0 ? EntityState.Added : EntityState.Modified;
if (foo.Bar != null)
{
    db.Entry(foo.Bar).State = 
       foo.Bar.BarId == 0 ? EntityState.Added : EntityState.Modified;
                                                             ^^^
    // If you don't want to change the Bar while creating a relationship between
    // Foo and with existing Bar, you can change 
    // `EntityState.Modified` with `EntityState.Unchanged`
}
db.SaveChanges();

와 연관되다 AddOrUpdate, 내 생각에는 발견할 수 있는 미해결 문제가 있는 것 같습니다. 여기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top