EF проблема сохранения одного из нескольких объектов - PullRequest
0 голосов
/ 19 августа 2011

У меня есть классы Персона и Собака.Собака принадлежит одному человеку, и у человека могут быть разные собаки (то есть один ко многим).

У меня есть метод испытания, который позволяет получить 2 человека из БД.Если человек не существует в БД, я делаю это.Затем я хочу сохранить 4 собаки.

Это тест:

Person person1= personResourceAccess.GetPersonByName("Person1");
        if(person1==null)
        {
            Person person = new Person()
                            {
                                Name = "Person1"
                            };
            person1= personResourceAccess.CreatePerson(person);
        }
Person person2= personResourceAccess.GetPersonByName("Person2");
            if(person2==null)
            {
                Person person = new Person()
                                {
                                    Name = "Person2"
                                };
                person2= personResourceAccess.CreatePerson(person);
            }
Dog dog1 = new Dog(){name="Dog1", owner = person1};
Dog dog2 = new Dog(){name="Dog2", owner = person1};
Dog dog3 = new Dog(){name="Dog3", owner = person1};
Dog dog4 = new Dog(){name="Dog4", owner = person2};

dog1 = dogResourceAccess.CreateDog(dog1);
dog2 = dogResourceAccess.CreateDog(dog2);
dog3 = dogResourceAccess.CreateDog(dog3 );
dog4 = dogResourceAccess.CreateDog(dog4 ); 

Это код доступа к ресурсу:

public Dog CreateDog(Dog dog)
    {
        try
        {
            db.Dogs.AddObject(dog);
            db.SaveChanges();
            return dog;
        }
        catch(Exception ex)
        {
            return null
        }
    }

Когда я сохраняюПервая собака, все остальные собаки созданы в БД.Почему это так и как я могу предотвратить это?Я думаю, что это может иметь какое-то отношение к контексту, но я не могу решить проблему.

1 Ответ

1 голос
/ 19 августа 2011

Это правильное поведение. SaveChanges всегда сохраняйте все изменения, отслеживаемые в данный момент контекстом. Нет способа избежать этого - это называется единицей работы. Причиной, по которой это происходит, является назначение владельца при инициализации новой собаки. Person уже отслеживается контекстом, поэтому назначение его любому другому объекту немедленно начнет отслеживание этого объекта.

Если вы хотите сохранить изменения в последовательности, вы должны сделать это по-другому:

Dog dog1 = new Dog(){name="Dog1"};
dog1 = dogResourceAccess.CreateDog(dog1);
dog1.owner = person1; // Attach the person after you added a new dog.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...