c# – 将UserId分配给外键= null
我正在使用Entity Framework 5和MVC 4,使用.NET 4.5使用Code First迁移.我在两个实体之间有1到0或1关系的外键.当我尝试为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”)]来确保发布正确的字段. [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指出我正确的方向. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- fastboot flash system system.img 卡在sending system.img
- iphone – 关于如何手动安装XMPPFramework的最新说明?
- cocos2d-x游戏实例(25)-简易动作游戏(3)
- React-Native屏幕适配之ImageView的应用解析
- reactjs – 如何在开发外部组件时避免“加载两个React副本”
- 翻译 | 开始使用 TypeScript 和 React
- ruby – 有没有更好的方法从rake中运行capistrano任务?
- c# – 是否足以禁止输入中的单引号以避免SQL注入?
- c# – .NET事件提升和NullObject模式
- postgresql 删除单个表的数据