Entity Framework и WCF (возвращение объектов, привязанных к контексту) - PullRequest
2 голосов
/ 06 декабря 2010

У меня есть служба WCF, которая вызывает следующий метод в одном из моих объектов репозитория для создания нового объекта продажи в базе данных

public static Sale New(Sale sale)
{
    using (var ctx = new DBcontext())
    {
        ctx.Sales.AddObject(sale);
        ctx.SaveChanges();
        return sale;
    }
}

Метод WCF, вызывающий это, выглядит следующим образом

public Sale SaleNew(Sale sale)
{
    return SaleRepository.New(sale);
}

Когда я вызываю это из клиентского приложения, я получаю следующую ошибку

"Базовое соединение было закрыто: соединение было неожиданно закрыто."

ЕслиЯ перебираю весь код, кажется, работает нормально, и запись попадает в базу данных.Если я добавлю следующую строку в мой метод репозитория после SaveChanges, он будет работать нормально

ctx.Detach(sale);

Исключение происходит, потому что я удаляю контекст, как только метод возвращается?Является ли использование контекста сущности таким образом плохой практикой, т. Е. Избавляется от него сразу?Я делаю это только потому, что его SOA и практически без сохранения состояния, поэтому все мои методы репозитория создают контекст, возвращают значение и удаляют контекст.Все, что передается, будет добавлено в контекст или повторно присоединено.

Ответы [ 2 ]

3 голосов
/ 07 декабря 2010

Как мне посоветовали, я включил трассировку в WCF и наблюдал за происходящим. Произошло исключение прокси. В этом случае, поскольку я использую свои собственные объекты POCO, мне не нужны прокси-объекты, поэтому я установил для свойства ContextOptions.ProxyCreationEnabled в DatabaseContext значение false, и теперь оно работает нормально.

2 голосов
/ 06 декабря 2010

1) Является ли использование контекста сущности таким образом плохой практикой, т. Е. Сразу его утилизировать?

Нет, вот как я это делаю - и я верю, что это правильный способ сделать это. Но создание контекста может быть дорогим , а с EF мы застряли на без идеального способа повторного использования контекста.

2) ctx.Detach(sale);

Это, насколько я знаю, не должно требоваться для того, что вы делаете, хотя у меня было множество проблем с присоединением и отсоединением, когда я повторно использую те же сущности. Это необходимо только в том случае, если вам необходимо повторно присоединиться к контексту. Используете ли вы Ленивая загрузка ?

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