实体框架:自引用DbSet,发生参照完整性约束违规

时间:2017-05-05 14:02:01

标签: c# wpf entity-framework mvvm

我有一个WPF应用程序,其树列表包含以下类别类。树列表允许您创建新类别并设置父类别,但是,当我尝试设置父类别并保存时,我收到此错误:

发生了引用完整性约束违规:关系一端的“Category.Id”的属性值与另一端的“Category.ParentCategoryId”的属性值不匹配。

我尝试创建单元测试并手动输入值,以确保它不是树列表的数据绑定问题。我把它缩小到了课程的设计方式,但我不明白为什么我会遇到这个问题 Here is a picture of the tree list if you want to see what I'm trying to accomplish

我的许多视图模型都是使用类似的保存方法从save viewmodelbase派生的,所以我很困惑为什么他们的外键会保存,但是父类别会导致错误。

   public class Category : BaseDbClass
{

    public string CategoryName { get; set; }


    public Category ParentCategory { get; set; }
    public List<Category> SubCategories { get; set; }

    public int? ParentCategoryId { get; set; }
    public override string ToString()
    {
        return CategoryName;
    }
}
  public class BaseDbClass : ICheckTheDirty
{
    [NotMapped]
    public bool IsDirty { get; set; }

    public int Id { get; set; }

    public BaseDbClass()
    {
        DateCreated = DateTime.Now;
        DateUpdated = DateTime.Now;
        UserWhoUpdated = Environment.UserName;
    }


    public void ItemChanged()
    {
        IsDirty = true;
    }

    public void ItemSaved()
    {
        IsDirty = false;
    }


    public string UserWhoUpdated { get; set; }
    public DateTime? DateUpdated { get; set; }
    public DateTime? DateCreated { get; set; }
}

这是我在viewmodel中保存类别的方法:

 using (ProductContext db = new ProductContext())
        {
            foreach (var category in ItemsCollection)
            {
                if (category.IsDirty)
                {
                    db.Entry(category).State = EntityState.Modified;
                    category.ItemSaved();
                }
            }
            var s = await db.SaveChangesAsync();
            MessageBox.Show(s.ToString());
        }

以下是xaml代码,了解它在视图中的设置方式

<dxg:GridControl Grid.Column="0" EnableSmartColumnsGeneration="True" ItemsSource="{Binding ItemsCollection}"
                                       SelectedItem="{Binding SelectedItem}">
                <dxg:GridControl.View>
                    <dxg:TreeListView AllowPerPixelScrolling="True" ShowTotalSummary="True" KeyFieldName="Id"
                                          ParentFieldName="ParentCategoryId" />
                </dxg:GridControl.View>
                <dxg:GridColumn FieldName="CategoryName" IsSmart="True" />
                <dxg:GridColumn FieldName="ParentCategory" IsSmart="True">
                    <dxg:GridColumn.EditSettings>
                        <dxe:ComboBoxEditSettings ItemsSource="{Binding ItemsCollection}" />
                    </dxg:GridColumn.EditSettings>
                </dxg:GridColumn>
            </dxg:GridControl>

网格控制来自devexpress。它使用parentcategoryid

0 个答案:

没有答案