Слияние с заявлением и Entity Framework - PullRequest
2 голосов
/ 09 июня 2011

У меня есть процедура слияния, сохраненнаяЯ сопоставил процесс с моей сущностью для вставки и обновленияПри запуске я получаю следующую ошибку - Любые идеи?

Указанная схема недействительна.Ошибки: Model1.msl (23,14): ошибка 2038: параметр DataField связан несколько раз.

Процесс:

ALTER PROCEDURE [dbo].[USP_UPSERT_SimpleTableExample]
(
    @NaturalKey1 nchar(10),
    @NaturalKey2 nchar(10),
    @NaturalKey3 nchar(10),
    @DataField nchar(10)
 )

AS
BEGIN
    -- Start Transaction
    BEGIN TRAN

    MERGE INTO dbo.SimpleTableExample ChangeSet
    USING (SELECT   @NaturalKey1 as key1,
                    @NaturalKey2 as key2,
                    @NaturalKey3 as key3) CurrentSet
    ON  ChangeSet.NaturalKey1 = CurrentSet.key1 AND
        ChangeSet.NaturalKey2 = CurrentSet.key2 AND
        ChangeSet.NaturalKey3 = CurrentSet.key3     
    WHEN MATCHED THEN 
        UPDATE SET DataField = @DataField

    WHEN NOT MATCHED 
        THEN INSERT VALUES
           (@NaturalKey1,
           @NaturalKey2,
           @NaturalKey3,
           @DataField) 

    OUTPUT INSERTED.SurrogateKey;

    COMMIT TRAN        

END

И мой тестовый код;

static void Main(string[] args)
{
    Class1 c1 = new Class1();

    var test = new SimpleTableExample();
    test.DataField = "data1";
    test.NaturalKey1 = "1";
    test.NaturalKey2 = "2";
    test.NaturalKey3 = "3";

    c1.test(test);
}

public string test(SimpleTableExample ste)
{

    ExamplesEntities1 ex1 = new ExamplesEntities1();

    ex1.AddToSimpleTableExamples(ste);
    ex1.SaveChanges();

    Console.WriteLine("SurrogateKey:0", ste.SurrogateKey);
    Console.WriteLine("EntityKey:0", ste.EntityKey);
    return ste.EntityKey.ToString();
}

1 Ответ

0 голосов
/ 10 июня 2011

Проблема решена. Ошибка была добавлена, потому что я сопоставил процесс Upsert с таблицей два раза, один раз как вставка и один раз как обновление. Это было неправильно!

Я удалил сопоставление таблицы с сохраненным процессом.

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

Затем я добавил функцию import к сохраненному процессу и заставил его вернуть коллекцию, поэтому моя таблица.

Затем я изменил код POC, чтобы взять результаты сбора и вернуть первый суррогатный ключ;

public string test(SimpleTableExample ste)
        {

            ExamplesEntities1 ex1 = new ExamplesEntities1();
            var results = ex1.USP_UPSERT_SimpleTableExample(ste.NaturalKey1, ste.NaturalKey2, ste.NaturalKey3, ste.DataField).ToList<SimpleTableExample>();
            string returnvalue = results.First().SurrogateKey.ToString();
            return returnvalue;
        }

Тест выполнил вставку, когда не было подходящих натуральных клавиш, и обновление, когда натуральные ключи совпали.

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