LINQ-to-SQL+一对多+数据绑定删除两张表的数据库加载数据(一菜多料)).我加载了一个Recipe,LINQ将Ingredient对象检索到绑定到ListBox的EntitySet中。如果我想从食谱中删除一些成分,我会收到“试图删除食谱和成分之间的关??系。但是,其中一个关系的外键(Ingredient.RecipeID)不能设置为null。我通过在DBML文件中添加'DeleteOnNull="true"'使用众所周知的解决方案解决了这个问题。但是添加此设置只会在我们删除从数据库中检索到的Ingredient对象时解决此问题。问题出在创建的Ingredient对象中(已添加到食谱)并添加到成分的EntitySet集合中,然后在调用SubmitUpdates之前删除。然后,同样的异常再次发生。当用户向其中添加成分时,获取错误并从配方中删除成分,通常是这样发生在新的未保存的食谱上。我将DeleteOnNull添加到DBML中的“AssociationName="Recipe_Ingredient"”行。我如何删除这些项目?到目前为止我看到的唯一解决方案是我将添加的成分加载到一个集合中,而不是在下面DataContext,然后在保存时,从配方中删除所有成分,然后再从该缓存中添加它们。尝试{//现有记录需要,但新记录将失败DeleteOnSubmit(成分);}catch(Exception){//Swallow}yourRecipeObject.Ingredients.Remove(ingredient);几天前,当我问“如何为带有确定/取消按钮的数据绑定WPF对话框设计支持数据类型时?””,你似乎在寻找我自己在寻找的东西。答案是PaulStovell发表的一篇有趣的文章,它描述了一个用于LinqtoSql的示例IEditable适配器。这将允许您以通用方式创建所需的“应用/取消”语义,而无需通过与基ORm生成的类完全分离的完整自定义编写层。总的来说,这是一个非常漂亮的技巧,基本上可以让您回避您现在正在解决的问题。?另一方面,我很好奇为什么你的配料关系配方是1:n而不是m:n。?这是为了简单吗?我在许多食谱中都使用大蒜。?//创建新实体Cartc=newCart();CartEntryce=newCartEntry();ce.Cart=c;//删除条目c.CartEntries.Remove(ce);;dc.CartEntries.DeleteOnSubmit(ce);//将购物车插入数据库dc.Carts.InsertOnSubmit(c);dc.SubmitChanges();问题说明:实体c和ce与数据上下文无关——它们未被跟踪。EntitySet.Remove()(先移除行)只移除c和ce之间的关系。虽然c可以在没有相关购物车条目的情况下存在,但由于外键约束,ce不能在没有相关购物车的情况下存在。在向数据库提交更改时也会处理断开连接的CE,从而导致违反约束和异常。为了摆脱未跟踪和断开连接的购物车条目,您需要将其附加到您的数据上下文(使其被跟踪),然后在提交时将其标记为删除。提交更改后,购物车条目将被正确删除,不会导致异常。有关该问题的更多详细信息,请查看:http://msdn.microsoft.com/en-us/library/bb546187%28v=VS.100%29.aspx您需要将保存代码与GUI中的事件分开,看起来您有点急于在尘埃落定之前将内容保存到数据库中,并且您正在排队并从数据库中删除一开始从未到达的内容,最好是在用户“提交”的时候他们的更改,并且在那一刻,处理GUI的全部情况-这将为您节省一堆意大利面条代码。我也很想知道您的实体是否具有自动编号ID,或者您是否正在使用其他ID机制。您可能正在向数据库发送一个DELETE以获取尚未提交的成分记录,而且我认为如果这些记录包含NULLID,linq会变得很糟糕。您是否已将文本编写器连接到您的DataContext.Log以查看在您获得异常之前正在生成哪种SQL?感谢您的回答,我会查看帖子,看看我能做些什么。我必须说我很惊讶甚至看到这个问题出现,我可以将记录添加到LINQ提供的数据“缓存”,然后决定删除其中一些然后提交,这似乎很自然。更改跟踪应该能够处理这个问题。我刚开始使用LINQ,所以我可能在代码的某处犯了一个愚蠢的错误(不会是第一个)。另一方面:大蒜可以属于许多食谱,这是真的(不是我的鸡尾酒食谱!)。我实际上是用一个文章对象/表来模拟它。但是对于食谱,您需要数量。因此,在我的模型中,您有一个食谱,其中包含1:n种成分,每种成分都有一个数量,1:1链接到一篇文章(带有名称、酒精含量和一些数据以建立交换性等级)和1:1链接到单位(数量有意义)。因此,从某种意义上说,配料表在食谱和文章之间创建了M:N关系,同时向每个单独的链接对添加了一些额外信息。我也有完全一样的问题。我有一个父/子层次结构,在不保存到数据库的情况下添加和删除子实体时,出现“尝试删除关系”异常。我发现只有在保存之前将子对象样式属性设置为另一个linq-sql实体时才会出现问题。例如1。这会产生错误RetailAccountCustomerCardracc=newRetailAccountCustomerCard();卡片addedCard=_idc.Cards.Where(c=>c.CardId==card.CardId).ToList().First();racc.Card=addedCard;this.CurrentCustomer.RetailAccountCardsBindingList.Add(racc);//在保存到数据库之前由用户触发的一些代码CurrentCustomer.RetailAccountCardsBindingList.Remove(racc);2.这不会产生错误RetailAccountCustomerCardracc=newRetailAccountCustomerCard();racc.CardId=card.CardId;//请注意,我设置的是Id属性而不是对象this.CurrentCustomer.RetailAccountCardsBindingList.Add(racc);//在保存到数据库之前由用户触发的一些代码CurrentCustomer.RetailAccountCardsBindingList.Remove(racc);奇怪的是,1中的错误表明问题出在RetailAccountCustomerCard的RetailAccountCustomerId属性上。它与我添加的Card对象没有任何关系。似乎只需设置新实体的任何对象属性就会触发问题。注意。示例1在保存时运行良好,只有在保存前删除新实体时才会出现问题。我有一个类似的问题,作为一种解决方法,我需要调用DataContext.GetChanges()然后一切似乎再次流动:)您可能遇到的另一个问题是您绑定到列而不是实体属性,因此引用集合是未更新(??已由其他人声明,但此事实已强制执行)。以上就是C#学习教程:LINQ-to-SQL+一对多+数据绑定删除所有分享的内容。如果对你有用,需要了解更多C#学习教程,希望大家多加关注——本文来自网络合集,不代表立场,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处:
