Jur*_*rij 9 c# entityset linq-to-sql
我使用LINQ-to-SQL从具有一对多关系的两个表的数据库加载数据(一个Recipe有许多成分).
我加载一个Recipe,LINQ将Ingredient对象检索到绑定到ListBox的EntitySet中.
如果我想从食谱中删除一些成分,我会得到一个"尝试删除食谱和成分之间的关系.但是,其中一个关系的外键(Ingredient.RecipeID)不能设置为null.
我通过在DBML文件中添加'DeleteOnNull ="true"'使用众所周知的解决方案解决了这个问题.但添加此设置仅在我们删除从DB检索到的Ingredient对象时才会消除此问题.
问题在于在代码中创建的成分对象(添加到配方中)并添加到成分的EntitySet集合中,然后在调用SubmitUpdates之前删除.然后,再次发生同样的异常.这通常发生在一个新的,未保存的食谱上,当用户向其添加成分,出错并从食谱中删除一种成分时.我将DeleteOnNull添加到DBML中的'Association Name ="Recipe_Ingredient"'行.
我该如何删除这些物品?我目前看到的唯一解决方案是,我会将成分加载到不在DataContext下的集合中,然后在保存时,删除配方中的所有成分,然后再从该缓存中添加..
try
{
// Needed for existing records, but will fail for new records
yourLINQDataContext.Ingredients.DeleteOnSubmit(ingredient);
}
catch (Exception)
{
// Swallow
}
yourRecipeObject.Ingredients.Remove(ingredient);
Run Code Online (Sandbox Code Playgroud)
你需要将保存代码与GUI中的事件分离,看起来你有点急于在尘埃落定之前将东西保存到数据库,并且你正在排队并从数据库中删除从未到达那里的东西首先,最好能够确定用户“提交”更改的时间点,并在此时处理 GUI 的完整情况 - 这将为您节省一堆意大利面条代码。
我也很想知道您的实体是否有自动编号 ID,或者您是否正在使用其他 ID 机制。您可能正在向数据库发送 DELETE 以获取尚未提交的成分记录,如果这些记录包含 NULL ID,我认为 linq 可能会变得很糟糕。
您是否已将文本编写器连接到 DataContext.Log 以查看在收到异常之前生成了哪些类型的 SQL?
| 归档时间: |
|
| 查看次数: |
11263 次 |
| 最近记录: |