我在实体框架中删除了一个问题.简而言之,EF显式尝试从数据库中删除实体,即使我已经明确地将EF配置为在数据库中使用级联删除.
我的设计:
我有三种实体类型MainEntity,EntityTypeA和EntityTypeB.EF已经配置在删除时使用级联删除EntityTypeA和EntityTypeB.换句话说,如果我删除了一个实例MainEntity,我希望删除所有相关EntityTypeA和EntityTypeB实例.我从不删除EntityTypeA或EntityTypeB不删除他们的父母.
我的问题是EF明确地发出了一个DELETE声明EntityTypeA,导致我的应用程序崩溃.
这就是我的模型:

这些关系具有以下非默认配置:
MainEntity -> EntityTypeA OnDelete: CascadeMainEntity -> EntityTypeB OnDelete: Cascade这种关系EntityTypeA -> EntityTypeB有OnDelete: None
数据库内容
INSERT INTO MainEntities (Name) values ('Test')
insert into EntityTypeA (MainEntityID) VALUES (1)
insert into EntityTypeB (MainEntityID, EntityTypeAId) VALUES (1, 1)
insert into EntityTypeB (MainEntityID, EntityTypeAId) VALUES (1, 1)
Run Code Online (Sandbox Code Playgroud)
我的代码:
class Program
{ …Run Code Online (Sandbox Code Playgroud) 我试图使用EF代码优先删除数据库记录(deleteMe)和它的子(deleteMe.Prices).
foreach (var deleteMe in deleteThese)
{
// Delete validation
if(CanDeleteItem(deleteMe.ItemId))
{
db.Entry(deleteMe).State = EntityState.Deleted;
foreach (var item in deleteMe.Prices)
{
db.Entry(item).State = EntityState.Deleted; // cascade delete
}
}
}
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
但是,实体框架似乎无法跟踪在父项之前应删除子记录的事实.我收到错误:
DELETE语句与REFERENCE约束"ItemPrice_Item"冲突.
冲突发生在数据库"DEVDB",表"dbo.ItemPrices",列'Item_ItemId'中.
该语句已终止.
我如何在EF中执行此删除?
启动了一个新的ASP.NET MVC 3应用程序并收到以下错误:
无法删除主键值,因为仍然存在对此键的引用.
怎么解决这个?
型号(EF代码优先)
public class Journal
{
public int JournalId { get; set; }
public string Name { get; set; }
public virtual List<JournalEntry> JournalEntries { get; set; }
}
public class JournalEntry
{
public int JournalEntryId { get; set; }
public int JournalId { get; set; }
public string Text { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
调节器
//
// POST: /Journal/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
Journal journal = db.Journals.Find(id);
db.Journals.Remove(journal);
db.SaveChanges(); // **exception occurs …Run Code Online (Sandbox Code Playgroud) c# asp.net asp.net-mvc entity-framework entity-framework-4.1
DBContext类是
public class VGDB : DbContext
{
public DbSet<Planet> Planets { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
模型看起来像:
public class Planet
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
...
public List<Building> Constructions { get; set; }
}
public class Building
{
[Key]
public int Id { get; set; }
public decimal Lvl { get; set; }
public string Type { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
存储库类:
public class VGDBRepository
{
private readonly VGDB _vgdb; …Run Code Online (Sandbox Code Playgroud)