C# 独立创建的依赖项(外键约束)
在我的MVC项目中,我首先使用了代码。我在试图删除所谓的子类中的一个条目时遇到了一个问题,该条目声明外键中存在冲突。但是我没有创建外键列,但是它是由于子类(C# 独立创建的依赖项(外键约束),c#,mysql,asp.net-mvc,asp.net-mvc-5,foreign-keys,C#,Mysql,Asp.net Mvc,Asp.net Mvc 5,Foreign Keys,在我的MVC项目中,我首先使用了代码。我在试图删除所谓的子类中的一个条目时遇到了一个问题,该条目声明外键中存在冲突。但是我没有创建外键列,但是它是由于子类(视图)中的以下行而生成的 public virtual List<TC> TC {get;set;} TC模型类 public int ViewsID {get;set;} /* Some other properties */ public virtual List<TC> TCList {get;set;}
视图
)中的以下行而生成的
public virtual List<TC> TC {get;set;}
TC模型类
public int ViewsID {get;set;}
/* Some other properties */
public virtual List<TC> TCList {get;set;} // This particular property was added just to be used as a filter in the View.
public int TCID {get;set;}
/* Some other properties */
public int? Views_ViewsID {get;set;} // This was added to try what I have mentioned above in `What I have tried`
My table for TC也具有上述结构,其中包含列Views\u ViewsID
作为外键。在我遇到删除视图的问题之前,我从未在模型类中添加过这个
因此,在我的代码中,该列基本上没有任何用途。仅仅因为我在视图模型类中有导航属性,我想这个列是自己添加的
现在,当我尝试删除任何视图时,即使在表TC
中没有相应的条目,删除操作也会抛出上述异常
用于在删除操作方法中设置外键null的代码
public ActionResult DeleteConfirmed(int id)
{
Views views = db.Views.Find(id);
var tc = db.TC.Where(x => x.Views_ViewsID == id).ToList();
foreach(var t in tc)
{
t.Views_ViewsID = null;
db.Entry(t).State = EntityState.Modified;
//db.SaveChanges();
}
db.Views.Remove(views);
db.SaveChanges(); // This line throws the exception
return RedirectToAction("Index");
}
电话号码
Views_ViewsID1
强烈建议您在如何设置EF关系方面存在问题
当您通过注释或fluent手动设置关系,但仅将其附加到一端时,通常会出现这种情况。另一端的navigation属性会自动创建要附加到的关系
您需要完全定义关系,或者删除您这样做的尝试。无论哪种方法都应该修复关系以删除重复的密钥。我对这个问题感到非常困惑。你能提供一个简单的代码示例来解释你想要实现的目标吗?@Coulton:是的,当然。。但我相信,要得到一个最小的代码来重现同样的效果是很困难的。因为问题在于数据库表。但是我可以试着找一个更好的解释酷,我期待着看到update@Coulton:希望现在这个问题能更好地解释这个问题。因为TC型号引用了ViewsID
,所以它有一个外键。有外键非常有意义,因为如果没有匹配的视图
,视图(u ViewsID
的内容就毫无意义。如果要删除TC记录引用了View
的View
记录,则需要删除TC记录,或者将其Views\u ViewsID
值设置为null。那么是否有任何方法可以绕过导航属性并删除Views条目?但是我找不到如何将Views\u ViewsID
的值存储到我已经存在的TC
表中。如果不修复您定义的关系?我不确定,它可能已经设置为HasOne而不是haseoptional。查看添加ViewID1字段的迁移中的代码。我在迁移中没有任何代码,因为我使用了代码优先迁移。代码优先使用Up和Down方法生成迁移类?它没有任何处理TC的内容。它只有与数据库中另一个表相关的代码,而这在当前上下文中是不相关的。