>外键是空引用
> dbo.Jogger不存在
>未处理的异常……没有元数据.
当我运行EF VIEwer时,导航关系是完美的.目前没有使用Fluent API代码.
用户类
[Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.IDentity)] public int UserID { get; set; } public string Username { get; set; } // Other propertIEs public int? JoggerID { get; set; } public virtual Jogger Jogger { get; set; }
慢跑者班
[ForeignKey("UserID")] public int JoggerID { get; set; } public virtual UserProfile UserID { get; set; }
生成JoggerController时,它会为Get和Post方法生成此代码:
// GET: /Jogger/Create public ActionResult Create() { VIEwBag.JoggerID = new SelectList(db.UserProfiles,"UserID","Username"); return VIEw(); } // // POST: /Jogger/Create [httpPost] [ValIDateAntiForgeryToken] public ActionResult Create(Jogger jogger) { if (ModelState.IsValID) { db.Jogger.Add(jogger); db.SaveChanges(); return RedirectToAction("Index"); } VIEwBag.JoggerID = new SelectList(db.UserProfiles,"Username",jogger.JoggerID); return VIEw(jogger); }
在Jogger / Create视图中,根据生成的代码,没有JoggerID或UserID的字段.
通常,它在代码的(ModelState.IsValID)部分失败,其中Output显示JoggerID = 0和UserID = null.
我没有在asp.net网站上的Contoso大学教程中看到这种行为,我也查看了MSDN学习EF网站.我似乎无法解决这个问题.您的建议表示赞赏.
解决方法 经过多次试验和错误,我找到了一种方法,可以为外键分配一个值.首先,我的关系设置不正确:UserProfile类不需要public int? GolferID代表导航属性.最后的课程如下:
用户资料
[Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.IDentity)] public int UserID { get; set; } public string Username { get; set; } // Navigation propertIEs public virtual Jogger Jogger { get; set; }
慢跑者班
[Key] [ForeignKey("UserID")]public int JoggerID { get; set; }public string Pronation {get; set;}public virtual UserProfile UserID { get; set; }
这可以设置正确的关系,而无需任何Fluent API代码.
分配ForeignKey值有点棘手,我确信有比这更好的方法.
>我使用了FormCollection而不是其他定义的脚手架方法(ID = 0).您还可以使用[Bind(Include =“fIEld1,fIEld2,fIEld3”)]来确保发布正确的字段.
>到登录用户的UserID有很长的路要走,它利用了User.IDentity.name
> FormCollection允许我引用和保存其他字段,例如旋前
[httpPost][ValIDateAntiForgeryToken]public ActionResult Create(FormCollection values){ var jogger = new Jogger(); TryUpdateModel(jogger); var context = new TestContext(); var userqq = User.IDentity.name; var user = context.UserProfiles.SingleOrDefault(u => u.Username == userqq); if (ModelState.IsValID) { jogger.JoggerID = user.UserID; jogger.Pronation = values["Pronation"]; db.Joggers.Add(jogger); db.SaveChanges(); return VIEw(); } VIEwBag.JoggerID = new SelectList(db.UserProfiles,jogger.JoggerID); return VIEw(jogger);}
这根本不是很好,但确实有效.感谢@Moeri指出我正确的方向.
总结以上是内存溢出为你收集整理的c# – 将UserId分配给外键= null全部内容,希望文章能够帮你解决c# – 将UserId分配给外键= null所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)