所以我试图抓住EF6
并使用Identity 2.0
来建立多对多的关系。它是Visual Studio 2013和MVC 5模板。
我有一个新的MVC应用程序,其中包含以下模型:
public class Meeting
{
public Guid MeetingID { get; set; }
public string Title { get; set; }
public virtual ICollection<ApplicationUser> Attendees { get; set; }
}
public class ApplicationUser : IdentityUser
{
public ICollection<Meeting> Meetings { get; set; }
}
然后我为Meetings
搭建控制器和视图。现在,例如,如果我只想将user
作为attendee
添加到我的meeting
,我想我可以将Create
操作修改为看起来像public ActionResult Create(Meeting meeting)
{
if (ModelState.IsValid)
{
meeting.MeetingID = Guid.NewGuid();
db.Users.ForEachAsync(u => meeting.Attendees.Add(u));
db.Meetings.Add(meeting);
db.SaveChanges();
return RedirectToAction("Index");
}
else...
}
以下内容:
LocalDB
但是我不认为它有效,因为我在@{foreach (var item in Model.Attendees)
{
<li>@item.UserName</li>
}}
中没有看到它,如果我将其添加到会议的详细视图中,我就没有结果:
public async Task<ActionResult> Create(Meeting meeting)
{
if (ModelState.IsValid)
{
meeting.MeetingID = Guid.NewGuid();
await db.Users.ForEachAsync(u => meeting.Attendees.Add(u));
db.Meetings.Add(meeting);
db.SaveChanges();
作为最后一点,我在LocalDB中有两个用户,test和test2。
哪些教程或文档可以让我这样做?
*编辑*
所以我尝试了你的建议(我承认,我不熟悉异步和等待以及如何实现它),我不得不修改控制器以允许我使用等待所以我不确定我是否我现在正确地执行此操作,但是我得到以下内容进行编译,并且我得到'对象引用没有设置为对象实例'的运行时错误:
{{1}}
(有可能我在实体框架上缺少一些我的模型设置吗?项目正是上面显示的代码加上默认值。)
答案 0 :(得分:1)
你要踢自己:)
(击鼓声)
您忘了在await
行之前添加ForEachAsync
:
await db.Users.ForEachAsync(u => meeting.Attendees.Add(u));
如果没有await
,应用程序会在async进程完成之前继续开始并保存记录。
<强>更新强>
您很可能尚未初始化Attendees
集合。只需在构造函数中将其设置为新的List<ApplicationUser>
即可。