Исключение при добавлении более одного объекта одновременно - PullRequest
2 голосов
/ 22 февраля 2012

Всякий раз, когда я делаю что-то вроде следующего:

public class MyDto
{
    [Key]
    public int ID { get; set; }

    public int ParentID { get; set; }

    public String Name { get; set; }
}

MyDataContext dataContext = new MyDataContext();

MyParentDto myParentDto; // <-- Existing parent DTO querried from the server. Has a relation to MyDto on MyDto.ParentID == MyParentDto.ID.
List<MyDto> myDtos = new List<MyDto>();

myDtos.Add(new MyDto
    {
        Name = "First MyDto!"
    });

myDtos.Add(new MyDto
    {
        Name = "Second MyDto!"
    });

// Some time later.


foreach (var myDto in myDtos)
{
    myDto.ParentID = myParentDto.ID;
    dataContext.MyDtos.Add(myDto);
}

dataContext.SubmitChanges(OnMyCallback)

Я получаю следующее смутное исключение, но мои данные отправляются просто отлично:

System.ServiceModel.DomainServices.Client.DomainOperationException: Submit operation failed.  An entity with the same identity already exists in this EntitySet.  

Трассировка стека заканчивается на:1007 *

System.ServiceModel.DomainServices.Client.EntitySet.AddToCache(Entity entity)
System.ServiceModel.DomainServices.Client.Entity.AcceptChanges()

Оба экземпляра MyDto устанавливаются на Detached до их добавления к dataContext и New впоследствии.Если я уменьшу количество добавленных MyDto экземпляров до одного, я не получу ошибку.Если я позвоню SubmitChanges между двумя добавляет.Опять же, оба экземпляра MyDto добавляются в базу данных очень хорошо, но клиент аварийно завершает работу с исключением.Что здесь происходит?Спасибо.

Правки:

// On the server

[Insert]
public void InsertMyDto(MyDto a_myDto) // <- Yes I prefix. :p
{
    try
    {
        MyEntity myEntity = new MyDto
        {
            ParentID = a_myDto.ParentID,
            Name = a_myDto.Name
        }   

        ObjectContext.MyEntities.AddObject(myEntity);
        ObjectContext.SaveChanges();

    }
    catch (Exception)
    {
        throw; // <- Never hits this spot.
    }
}

// Call back

public void OnMyCallback(SubmitOperation a_submitOperation)
{
        if (a_submitOperation.HasError)
            throw a_submitOperation.Error; // <- It doesn't matter if I have this or not, the client crashes anyway.

        // Other stuff that is not hit because it throws the exception above.
}

Ответы [ 2 ]

2 голосов
/ 27 февраля 2012

Я обнаружил, что решением моей проблемы является сохранение идентификатора обратно в dto при сохранении объекта. Как это:

[Insert]
public void InsertMyDto(MyDto a_myDto) // <- Yes I prefix. :p
{
    try
    {
        MyEntity myEntity = new MyDto
        {
            ParentID = a_myDto.ParentID,
            Name = a_myDto.Name
        }   

        ObjectContext.MyEntities.AddObject(myEntity);
        ObjectContext.SaveChanges();

        a_myDto.ID = myEntity.ID; // <- Solution

    }
    catch (Exception)
    {
        throw; // <- Never hits this spot.
    }
}
1 голос
/ 23 февраля 2012

Вы пытались установить родителя вместо его идентификатора?

foreach (var myDto in myDtos)
{
    myDto.Parent = myParentDto;
} //Assuming myParentDto is already in the context, if not add it first

Редактировать : я делаю дикое предположение, но не могли бы вы проверить HashCode объектовпрямо перед исключением?Вы также можете попробовать переопределить метод GetHashCode(), чтобы каждый раз возвращать что-то случайное, просто чтобы проверить, какие именно объекты входят в исключение.

...