【问题标题】:asp.net mvc 5, entity framework 6 code first, Identity 2.0. How to set navigation property to model object?asp.net mvc 5,entity framework 6 code first,Identity 2.0。如何将导航属性设置为模型对象?
【发布时间】:2015-05-19 21:48:28
【问题描述】:

应该很简单,不知道为什么我在网上找不到解决方案。也许它特定于 EF6 或 ASP Identity,或者我输入了错误的搜索关键字。

为了简单起见,假设我有两个模型类 Teacher 和 Kid;一个孩子只能分配给一位老师,但一位老师可以有多个孩子。它是多用户环境,因此每个孩子和每个老师都属于特定用户。因为我首先使用代码,所以我的数据库是由这些模型类构建的:

public class Kid
{
    [Required]
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    public virtual Teacher { get; set; }    
    [Required]
    public virtual ApplicationUser User { get; set; }
}

public class Teacher
{
    [Required]
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public virtual ICollection<Kid> Kids { get; set; }
    [Required]
    public virtual ApplicationUser User { get; set; }
    }

我有一个添加新孩子的观点: 孩子名字的文本框; 带有教师列表的下拉列表

所以,我正在创建一个数据传输对象,专门用于该视图:

public class AddNewKidViewDTO
{
    public string Name {get; set;}
    public IEnumerable<SelectListItem> Teachers { get; set; }
    public int SelectedTeacherId { get; set; }
}

表单被提交,我得到了填充的 AddNewKidViewDTO 模型。

现在,我需要在数据库中插入一个新 Kid。因此,我将 AddNewKidViewDTO 属性一一映射到我的 Kid 模型属性:

public void InsertNewKid {AddNewKidViewDTO addNewKidViewDTO}
{
    Kid kid = new Kid();
    kid.Name = AddNewKidViewDTO.Name;
    // here comes the question. How do I set Kid.Teacher and Kid.User?
}

更新 1

我不是在问如何获得选定的教师 ID。我需要知道如何将导航属性分配给模型对象(使用该 ID)。

更新 2:

如果我得到这样的当前用户对象:

ApplicationUser user = usermanager.FindById(User.Identity.GetUserId<int>());

然后将其附加到 Kid:

Kid.User = user;

在 Kid 插入时,它会引发异常:

元数据集合中不存在身份为“mynamespace.DAL.Kid_User”的成员。

任何帮助表示赞赏。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-5 ef-code-first entity-framework-6 asp.net-identity-2


    【解决方案1】:
    public void InsertNewKid {AddNewKidViewDTO addNewKidViewDTO}
    {
        Kid kid = new Kid();
        kid.Name = AddNewKidViewDTO.Name;
        kid.Teacher = yourdatacontext.Teachers.Find(addNewKidViewDTO.SelectedTeacherId);
        // The context.Savechanges() can be done either here or in your actionlink
    }
    

    假设您知道适当的 ID,您应该能够对用户执行相同的操作。也可以使用 .where 方法,如果您手头没有 id。 示例:

    kid.User = context.Users.Where(x => x.Name == "whatever string").FirstOrDefault<User>();
    

    这可以通过任何属性来完成。

    考虑到您的数据库已正确生成一对多关系,孩子应该自动添加到“父母”老师的孩子集合中。

    但是我担心 [Required] for

    public virtual ICollection<Kid> Kids { get; set; }
    

    一个孩子依赖于老师的存在,但我并没有真正看到依赖是双向的。

    将教师构造函数添加到模型类中:

    public Teacher()
            {
                this.Kids = new HashSet<Kid>();
            }
    

    【讨论】:

    • 如果您曾经使用过一对一或多对多关系,我建议您查找模型构建器文档msdn.microsoft.com/en-US/data/jj591620
    • 我做了一些研究,不建议为了获取当前用户对象而访问数据库。可以通过“ApplicationUser user = usermanager.FindById(User.Identity.GetUserId());”来完成但是,将此对象附加到 Kid 会引发异常。顺便说一句,您对 Kid 收藏的 [Required] 是正确的,我现在将其删除
    • 由于kid集合未初始化,会不会是空异常?我们通常倾向于在上面编辑的模型构造函数中初始化集合。
    【解决方案2】:
    AddNewKidViewDTO.Teachers.FirstOrDefault(t=>t.Selected).Value
    

    以上代码将给出选定的教师 ID。

    你能发布 Kid 模型吗

    【讨论】:

    • Dinesh,请再读一遍这个问题。儿童模型已发布。我不需要选定的教师 ID。我有它。我需要知道如何将外键属性(导航属性)分配给模型对象。
    • 对不起 Lera,我误解了这个问题,没有看到 Kid 模型。如果你需要教师模型你可以得到这样的模型Teacher.FirstOrDefault(s=&gt;s.Id == AddNewKidViewDTO.Teachers.FirstOrDefault(t=&gt;t.Selected).Value) 然后将返回值分配给Kid.Teacher
    猜你喜欢
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 2014-12-21
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多