c# – 将UserId分配给外键= null

c# – 将UserId分配给外键= null,第1张

概述我正在使用Entity Framework 5和MVC 4,使用.NET 4.5使用Code First迁移.我在两个实体之间有1到0或1关系的外键.当我尝试为Jogger创建记录时,一切都会爆炸.我收到的错误消息是: >外键是空引用 > dbo.Jogger不存在 >未处理的异常……没有元数据. 当我运行EF Viewer时,导航关系是完美的.目前没有使用Fluent API代码. 用户类 [K 我正在使用Entity Framework 5和MVC 4,使用.NET 4.5使用Code First迁移.我在两个实体之间有1到0或1关系的外键.当我尝试为Jogger创建记录时,一切都会爆炸.我收到的错误消息是:

>外键是空引用
> 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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1251608.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存