Asp.net 实体框架:发生引用完整性约束冲突

Asp.net 实体框架:发生引用完整性约束冲突,asp.net,entity-framework-4.1,webforms,Asp.net,Entity Framework 4.1,Webforms,我正在用实体框架开发一个asp.net Web表单应用程序。当我试图从DISTRICT表中的现有数据更新PROVINCE\u ID时(我更改了以前在一个条目中选择并试图更新的PROVINCE\u ID),我得到了以下错误 A referential integrity constraint violation occurred: A primary key property that is a part of referential integrity constraint cannot be

我正在用实体框架开发一个asp.net Web表单应用程序。当我试图从
DISTRICT
表中的现有数据更新
PROVINCE\u ID
时(我更改了以前在一个条目中选择并试图更新的
PROVINCE\u ID
),我得到了以下错误

A referential integrity constraint violation occurred: A primary key property that is a part of referential integrity constraint cannot be changed when the dependent object is Unchanged unless it is being set to the association's principal object. The principal object must be tracked and not marked for deletion.
表结构如下

已更新

aspx页面中的代码

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <asp:EntityDataSource ID="District_EDS" runat="server" ConnectionString="name=ABC_DBEntities"
        DefaultContainerName="ABC_DBEntities" EnableFlattening="False" EntitySetName="DISTRICT"
        EnableUpdate="True" Where="it.DISTRICT_ID = @DISTRICT_ID">
        <WhereParameters>
            <asp:QueryStringParameter DbType="String" Name="DISTRICT_ID" QueryStringField="DISTRICT_ID" />
        </WhereParameters>
    </asp:EntityDataSource>
    <%--DropDownList Entity Data Source--%>
    <asp:EntityDataSource ID="Province_EDS" runat="server" ConnectionString="name=ABC_DBEntities"
        DefaultContainerName="ABC_DBEntities" EnableFlattening="False" EntitySetName="PROVINCE"
        EnableUpdate="True">
    </asp:EntityDataSource>
    <asp:DetailsView ID="District_DV" runat="server" AutoGenerateRows="False" DefaultMode="Edit"
        DataKeyNames="DISTRICT_ID,PROVINCE_ID" DataSourceID="District_EDS" OnItemCommand="District_DV_ItemCommand">
        <Fields>
            <asp:TemplateField HeaderText="District Id *" SortExpression="DISTRICT_ID">
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("DISTRICT_ID") %>'></asp:Label>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Eval("DISTRICT_ID") %>'></asp:Label>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Eval("DISTRICT_ID") %>'></asp:Label>
                </InsertItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Province Name *" SortExpression="PROVINCE_ID">
                <ItemTemplate>
                    <asp:Label ID="Label2" runat="server" Text='<%# Bind("PROVINCE_ID") %>'></asp:Label>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList ID="ddl_PROVINCE_id" Width="200" runat="server" DataSourceID="Province_EDS"
                        DataTextField="PROVINCE_NAME" DataValueField="PROVINCE_ID" SelectedValue='<%# Bind("PROVINCE_ID") %>'>
                    </asp:DropDownList>
                    <asp:RequiredFieldValidator ID="PROVINCE_ID_VAL" runat="server" ControlToValidate="ddl_PROVINCE_id"
                        ErrorMessage="Province Name is required." ValidationGroup="DISTRICT"></asp:RequiredFieldValidator>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:Label ID="Label2" runat="server" Text='<%# Eval("PROVINCE_ID") %>'></asp:Label>
                </InsertItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="District Name *" SortExpression="DISTRICT_NAME">
                <ItemTemplate>
                    <asp:Label ID="Label3" runat="server" Text='<%# Bind("DISTRICT_NAME") %>'></asp:Label>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txt_DISTRICT_name" Width="200" runat="server" Text='<%# Bind("DISTRICT_NAME") %>'></asp:TextBox>
                    <asp:RequiredFieldValidator ID="DISTRICT_NAME_VAL" runat="server" ControlToValidate="txt_DISTRICT_name"
                        ErrorMessage="District Name is required." ValidationGroup="DISTRICT"></asp:RequiredFieldValidator>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("DISTRICT_NAME") %>'></asp:TextBox>
                </InsertItemTemplate>
            </asp:TemplateField>
            <asp:CommandField ShowEditButton="true" ShowCancelButton="false" ValidationGroup="DISTRICT" />
        </Fields>
    </asp:DetailsView>
</asp:Content>

我是如何解决这个问题的?

也许这有一些指导意义:

private void UpdateInstructorCourses(字符串[]selectedCourses、讲师讲师或输出日期)
{ 
如果(selectedCourses==null)
{ 
讲师输出日期。课程=新列表();
返回;
} 
var selectedCoursesHS=新哈希集(selectedCourses);
var instructorCourses=新哈希集
(instructorToUpdate.Courses.Select(c=>c.CourseID));
foreach(数据库课程中的var课程)
{ 
if(selectedCoursesHS.Contains(course.CourseID.ToString()))
{ 
如果(!instructorCourses.Contains(course.CourseID))
{ 
讲师分组日期。课程。添加(课程);
} 
} 
其他的
{ 
if(讲师课程包含(课程ID))
{ 
讲师分组日期。课程。删除(课程);
} 
} 
} 
} 

这意味着在省中找不到新的省idtable@Ahmad. 没有。我正在使用
DropDownList
选择
PROVINCE\u ID
。从数据库表
PROVINCE
将数据填充到
DropDownList
。因此,请确保下拉列表的值正确(检查呈现的HTML)@Ahmad我已检查过它。没问题。您是否尝试通过编写显式代码进行更新?(如果是,请显示代码。)还是通过某些内置更新功能的webforms数据源控件实现?(如果是,有关正在使用的控件的详细信息、如何配置控件以及如何将数据绑定到控件可能会有所帮助。)
  // Return to index page after updating content on the page.
    protected void District_DV_ItemCommand(Object sender, DetailsViewCommandEventArgs e)
    {
        if (e.CommandName == "Update")
        {
            Response.Redirect("~/District/Index.aspx", false);

        }
    }
private void UpdateInstructorCourses(string[] selectedCourses, Instructor instructorToUpdate) 
    { 
        if (selectedCourses == null) 
        { 
            instructorToUpdate.Courses = new List<Course>(); 
            return; 
        } 

        var selectedCoursesHS = new HashSet<string>(selectedCourses); 
        var instructorCourses = new HashSet<int> 
            (instructorToUpdate.Courses.Select(c => c.CourseID)); 
        foreach (var course in db.Courses) 
        { 
            if (selectedCoursesHS.Contains(course.CourseID.ToString())) 
            { 
                if (!instructorCourses.Contains(course.CourseID)) 
                { 
                    instructorToUpdate.Courses.Add(course); 
                } 
            } 
            else 
            { 
                if (instructorCourses.Contains(course.CourseID)) 
                { 
                    instructorToUpdate.Courses.Remove(course); 
                } 
            } 
        } 
    }