asp.net mvc 5,entity framework 6 代码优先,Identity 2.0。如何将导航 属性 设置为模型 object?

asp.net mvc 5, entity framework 6 code first, Identity 2.0. How to set navigation property to model object?

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

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

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; }
    }

我想添加新孩子: 孩子名字的文本框; 包含教师列表的下拉菜单

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

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。我需要知道如何将导航 属性 分配给模型 object(使用该 ID)。

更新 2:

如果我得到当前用户 object 是这样的:

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

然后附在孩子身上:

Kid.User = user;

在插入 Kid 时,抛出异常:

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

感谢任何帮助。

AddNewKidViewDTO.Teachers.FirstOrDefault(t=>t.Selected).Value

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

你可以 post 儿童模型

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>();

这可以用任何属性完成。

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

但是我担心

的[必需]
public virtual ICollection<Kid> Kids { get; set; }

一个孩子依赖于老师的存在,但是我真的不明白这种依赖是双向的。

要直接添加到模型中的教师构造函数 class:

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