Почему я получаю ошибку, когда выбираю Entity в качестве коллекции возврата для хранимой процедуры в EF4? - PullRequest
0 голосов
/ 01 июня 2011

Я добавил сохраненный процесс через Entity Framework 4.0 Model.

Case1 :

Мой сохраненный процесс возвращает набор целых чисел (1,2,3,4 ...) и я выбрал Int32 в качестве коллекции возврата модели EntityFramework, и сгенерированный код теперь выглядит следующим образом:

public ObjectResult<Nullable<global::System.Int32>> CopyAssembly(Nullable<global::System.Int32> assemblyId)
    {
        ObjectParameter assemblyIdParameter;
        if (assemblyId.HasValue)
        {
            assemblyIdParameter = new ObjectParameter("assemblyId", assemblyId);
        }
        else
        {
            assemblyIdParameter = new ObjectParameter("assemblyId", typeof(global::System.Int32));
        }

        return base.ExecuteFunction<Nullable<global::System.Int32>>("CopyAssembly", assemblyIdParameter);
    }

Когда я его запускаю var res = (new SPEntities()).CopyAssembly(1);, я не получаю ошибки.Набор целых чисел возвращается, как и ожидалось.Я даже вижу в SQL Profiler, что запрос отправляется.

Case2 :

Я изменил свой сохраненный процесс, поэтому теперь он возвращает набор строк (col1, col2).Эта таблица соответствует EntityA .В Entity Framework Model я выбрал EntityA в качестве коллекции возврата.Сгенерированный код для этого теперь:

public ObjectResult<EntityA> CopyAssembly(Nullable<global::System.Int32> assemblyId)
    {
        ObjectParameter assemblyIdParameter;
        if (assemblyId.HasValue)
        {

            assemblyIdParameter = new ObjectParameter("assemblyId", assemblyId);
        }
        else
        {
            assemblyIdParameter = new ObjectParameter("assemblyId", typeof(global::System.Int32));
        }


        return base.ExecuteFunction<EntityA>("CopyAssembly", assemblyIdParameter);
    }

Когда я запускаю его var res = (new SPEntities()).CopyAssembly(1);, я всегда получаю следующую ошибку: An item with the same key has already been added. Я даже НЕ вижу запрос в SQL Profiler.

Почему CASE1 работает, а CASE2 - нет?Почему в CASE2 даже при отсутствии запроса к SQL (я не вижу его в профилировщике) я STILL получаю ошибку?Логичнее будет получать сообщение об ошибке после отправки запроса в SQL

Спасибо

...