2011-06-09 60 views
2

我有一个合并存储过程。我将proc映射到插入和更新的实体。当我运行时,我得到以下错误 - 任何想法?指定合并到声明和实体框架

模式是无效的。错误: Model1.msl(23,14):错误2038:参数DataField的 绑定多个 次。

的PROC:

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(); 
} 
+0

好吧,它告诉你,你的EDMX是无效的,甚至给你的行号。我首先看看那里...... – 2011-06-09 19:53:59

+0

如果你打开EDMX为XML,你在描述的行上看到了什么? – 2011-06-09 19:54:31

回答

0

问题解决了。我添加了错误,因为我将Upsert过程映射到表中两次,一次是插入,一次是更新。这是错的!

我删除了表映射到存储过程。

我改变了存储过程来代替返回surogate键返回什么插入或更新整个数据集,其中包括代理键。

接下来,我将函数导入添加到storedproc,并让它返回一个集合,以便我的表。

然后,我改变了POC代码,以集合的结果并返回第一surrogatekey;

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; 
     } 

测试在没有匹配的自然键和当自然键匹配时进行了更新。