如何在ADO.Net实体模型中将具有外键的表更新到另一个表?

时间:2009-12-22 05:42:06

标签: c# entity-framework ado.net

我有2个表,Table1有一个主键'CustomizationId',而Table2有一个与之匹配的FK Customizationid。表2没有主键。

我正在尝试从基于网络的表单添加新记录。我尝试将其保存到数据库中,但是出现错误:

            Customization customization = new Customization();
            Code code = new Code();
            customization.Name = CustomizationName.Text;               
            customization.LastUpdated = DateTime.Now;

            code.Top = top_js.InnerText;
            code.Bottom = bottom_js.InnerText;

            //code.CustomizationId = customization.CustomizationId;

            customization.Code = code;              
            entities.AddToCustomizations(customization);
            entities.SaveChanges();

当我调用SaveChanges时,无论是否添加注释行,我都会收到错误。

Unable to update the EntitySet 'Code' because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element to support the current operation.

我该如何处理这种情况?我只想在我添加自定义的同时添加代码。 “代码”表应将Customizationid设置为Customization设置的PK / Identity。

有什么想法吗?

1 个答案:

答案 0 :(得分:7)

就EF而言,没有PK的表是View。

这意味着您有两种选择:

  1. 说出一点谎言,并说服EF 'view' is a table
  2. Add modification functions(插入/更新/删除),以便您进行编辑。
  3. 一般来说,修改函数是存储过程,但如果您无权访问数据库,实际上可以直接将T-SQL添加到SSDL中......

    即。 EDMX的<StorageModel>元素中的每个操作(插入,更新和删除)都是这样的:

    <Function Name="InsertCode" BuiltIn="false" IsComposable="false" >
           <CommandText>
                    INSERT dbo.TCode(ID, Name) VALUES (@ID, @Name)
           </CommandText>
           <Parameter Name="ID" Type="int" Mode="In" />
           <Parameter Name="ID" Type="nvarchar(max)" Mode="In" />
    </Function>
    

    在SSDL中拥有修改功能后,您需要map them,以便EF根据需要使用它们。

    在你的情况下,我建议(1)。

    希望这有帮助。

    干杯 亚历