O.O*_*O.O 9 c# asp.net asp.net-mvc entity-framework entity-framework-4.1
启动了一个新的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 here**
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
数据库设置
public class FoodJournalEntities : DbContext
{
public DbSet<Journal> Journals { get; set; }
public DbSet<JournalEntry> JournalEntries { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
O.O*_*O.O 18
找到解决方案:
public class FoodJournalEntities : DbContext
{
public DbSet<Journal> Journals { get; set; }
public DbSet<JournalEntry> JournalEntries { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Journal>()
.HasOptional(j => j.JournalEntries)
.WithMany()
.WillCascadeOnDelete(true);
base.OnModelCreating(modelBuilder);
}
}
Run Code Online (Sandbox Code Playgroud)
如果从表中删除记录(比如说"blah"),它与其他表(xyz,abc)有其他关系.默认情况下,如果其他一个表中存在相关行,则数据库将阻止您删除"blah"中的行.
解决方案#1:
您可以先手动删除相关行,这可能需要大量工作.
解决方案#2:
一个简单的解决方案是配置数据库,以便在删除"blah"行时自动删除它们.
按照此打开数据库图表,然后单击关系上的属性

在"属性"窗口中,展开" INSERT和UPDATE规范",并将" DeleteRule"属性设置为"Cascade".

保存并关闭图表.如果系统询问您是否要更新数据库,请单击"是".
要确保模型使内存中的实体与数据库正在执行的操作保持同步,必须在数据模型中设置相应的规则.打开SchoolModel.edmx,右键单击"blah"和"xyz"之间的关联线,然后选择"属性".
在"属性"窗口中,展开" INSERT和UPDATE规范",并将" DeleteRule"属性设置为"Cascade".
| 归档时间: |
|
| 查看次数: |
26244 次 |
| 最近记录: |