2014-10-30 2 views
-1
for (int i = 0; i < libraryList.Count; i++) 
{ 
    if (ModelState.IsValid) 
    { 
     context.Library.Add(libraryList[i]); 
     context.SaveChanges(); 
    } 
} 

라이브러리에는 이미 DB에 설정된 엔티티 'predefinedgoals'가 포함되어 있습니다. 따라서 위의 코드가 실행되면 '미리 정의 된 목표'의 데이터를 저장하고 새 ID를 할당합니다..SaveChanges() 엔티티 프레임 워크에 복제본을 저장합니다.

기존 엔티티를 컨텍스트에 연결해야한다고 읽었지만 내 시나리오에서 어떻게해야하는지 잘 모르겠습니다. 수업은 다음과 같습니다 :

class library 
    int libraryID 
    list<book> bks 

.

class book 
    int bookID 
    list<importantdates> impdts 

.

class importantdate 
    int importantdateID 
    predefinedgoal predfg 
    int numberofresellers 

.

class predefinedgoal 
    int predefinedgoalID 
    string description 
    int daysfrompublication 

나는 ModelState.IsValid 후이 권리 같은 것을 시도하지만 난 내가 잘못을하고 있어요 감지 :

var prdfgs= context.predefinedgoals.ToList(); 
foreach(var pg in prdfgs) 
    context.predefinedgoals.Attach(pg); 
+0

'Library' 객체와 함께'Book' 객체를 만들고 있습니까? 아니면 이미 데이터베이스에 있습니까? – IronMan84

+0

@ IronMan84 예 설명 된 클래스에 나열된 모든 변수가 생성되어 저장되어야합니다. 그것만이 이미 존재하는 사전 정의 된 목표이므로, 다시 저장된 객체는 필요 없습니다. 기존 ID에 대한 참조입니다. – mdc

+0

Entity 프레임 워크는 열에 대해 알고있을뿐만 아니라 기본 키를 나타내며이 기본 키와 라이브러리의 외래 키 사이의 관계를 알고 있습니까? – BlueMonkMN

답변

0

내 시나리오에서 왜 중복 된 데이터를 저장했는지에 대한 해답은 두 개의 다른 클래스에서 작업을 수행한다는 것입니다. 각 클래스마다 다른 데이터베이스 컨텍스트 변수를 사용했습니다.

그래서 클래스 # 1이 내 질문에 하나인데, 그게 내가 컨텍스트 # 1을 사용하여 DB에 저장하는 곳입니다. 클래스 # 2에서 나는 모든 PredefinedGoals를 가져 와서 ImportantDates에 추가했지만 이것을하기 위해 컨텍스트 # 2를 만들었습니다. ID와 객체는 동일하지만 다른 컨텍스트 변수에서 가져 왔습니다.

클래스 # 1에서 PredefinedGoals를 컨텍스트 변수 # 1로 검색하여 해결하고이를 클래스 # 2의 인수로 보냈습니다.

3

이 대답은 가정의 부부를 기반으로 할 것입니다,하지만 내가 본 이 정확한 문제가 너무나 여러 번있어 자동으로 답변을 얻습니다.

당신이 생각하는 것은 Library, BookImportantDate 개의 개체를 만들고 (그 사이의 모든 관계를 설정하는 것입니다) 생각하고있는 것 같습니다. 그러나이 모든 작업을 수행하는 과정에서 실제 int FK 속성 (즉, PreDefinedGoalID과 같음)을 그대로두고 030으로 설정된 ImportantDate 개체에서 PreDefinedGoal 탐색 속성을 설정하려고합니다. 그 때 Entity Framework는 네비게이션 속성에 포함 된 개체에 ID가 있다는 사실을 무시하고 ImportantDate 개체를 만드는 것과 마찬가지로이 PreDefinedGoal 개체를 처음부터 만들려고한다고 가정합니다.). 그런 다음 실제로 사용하려는 것과 동일한 데이터로 PreDefinedGoal 개체를 만들지 만 데이터베이스에서 별도의 중복 레코드로 만듭니다.

문제에 대한 해결책은 간단합니다. 탐색 속성을 설정하지 마십시오. FK (ImportantDate.PreDefinedGoalID)를 연결하려는 PreDefinedGoal 개체의 ID로 설정하기 만하면됩니다. 그렇게하면 Entity Framework가 해당 ID를 기반으로 올바른 개체에 대한 데이터베이스에 손을 뻗어 데이터베이스에 중복 개체가 생기는 것을 방지합니다.

참고 : 나는 Julie Lerman의 MSDN posts 중 하나에서 이것을 배웠습니다. EF와 함께 일할 예정이라면, 그녀의 게시물과 칼럼을 읽는 것이 좋습니다.

+0

나는 혼란 스럽다. 'ImportantDate'는'predefinedGoalID'를 포함하지 않습니다. 나는 이것을 할 수 있습니다 : 'ImportantDate.PredefinedGoal.PredefinedGalalID = IDinDB'하지만 중복도 생성 할 것이고 단지'PredefinedGoal.description'과'PredefinedGoal.daysFromPublication'만이 null이 될 것입니다. – mdc

+0

ImportantDates의 모든 필드를 나열 해 주시겠습니까? FK 속성이없는 네비게이션 속성 만 있으면 안됩니다. – IronMan84

+0

모두 나열되어 있습니다. 내가'ImportantDate'에'PredefinedGoal' 객체 (차례로 자신의 ID를 포함하고있는 것)를 포함하는 것보다 다른 방법으로 FK를 지정해야한다는 것을 의미합니까? 'ImportantDate'는'PredefinedGoalID'를 포함하지만'PredefinedGoal' 객체를 통해서만 포함됩니다. 동급생은 아니야. – mdc

1

동일한 상황에 있으며 해결책을 찾았습니다. 이 해결 방법이 작동하는 방식은이 경우 EF가 상황을 잘못 처리하는 것에 책임이 있다고 생각하게 만듭니다.

예를 단순화하기 위해 하나의 객체와 탐색 속성을 예로 들어 보겠습니다.

public class Topic 
{ 
    int Id { get; set; } 
    public String Name { get; set; } 
    public String Description { get; set; } 
} 

public class Course 
{ 
    int Id { get; set; } 
    public Topic Topic { get; set; } 
    // additional properties don't matter now 
} 

외부 키나 기타 데이터 주석이 없음을 유의하십시오.EF6이 데이터베이스 스키마를 올바르게 만들고이를 ID이 기본 키라고 추측합니다. 새로운 ID로 새로운 주제 객체를 생성합니다 기존의 주제에 대한 새로운 과정을 추가하는 문제를 해결하지 않고

(가 부여 된 아이디를 덮어!) :

db.Courses.Add(course); 
await db.SaveChangesAsync(); 

뇌사 해결 방법 :

course.topic = db.Topics.Find(course.topic.Id); 
db.Courses.Add(course); 
await db.SaveChangesAsync(); 

즉, 항목이 컨텍스트에서 직접로드 된 경우 EF는 해당 항목을 기존 항목으로 인식하고 다시 추가하지는 않습니다.

업데이트 :

이 설정으로 더 많은 문제가 발생하는 것입니다 그러나
db.Topics.Attach(course.topic); 

, 그것을 사용하는 외래 키 속성 (들) 아마 최고와 코스의 한 TopicID 포함 : 그냥 다시로드하지 않고 개체를 연결하려면 목적. 다음은 정상적으로 작동하지만 여전히 나에게 어색해 보인다.

[ForeignKey("Topic")] 
    public int TopicId { get; set; } 

    [ForeignKey("TopicId")] 
    public virtual Topic Topic { get; set; } 

덜 중복 된 솔루션에 대해 듣고 싶다.

+0

이 기술을 일대 다 패턴에 적용 할 수 있습니까? 나는 당신의 일에 기반을 두려고 노력하고 있지만 꽤 잘 작동하는지 확신 할 수 없다. 나의 상황은 가상 목록이있는 코스를 갖는 것과 비슷하다.

관련 문제