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>();
}
应该很简单,不知道为什么在网上找不到解决办法。也许它特定于 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>();
}