我正在尝试更新我的某个实体中的列表。这就是我正在做的事情:
var loggedInUserId = User.Identity.GetUserId();
var applicationDbContext = new ApplicationDbContext();
var x = Request["groupCode"];
var affectedGroup = db.StudentGroups.FirstOrDefault(s => s.Code == x);
var groupId = affectedGroup.Id;
if (affectedGroup != null)
{
if (affectedGroup.StudentIds == null)
{
affectedGroup.StudentIds = new List<string>();
}
if (affectedGroup.StudentIds.Contains(loggedInUserId))
{
TempData["ErrorMessage"] = "You are already a member of this group";
}
else
{
affectedGroup.StudentIds.Add(loggedInUserId);
db.SaveChanges();
}
}
这是我的StudentGroup模型:
public class StudentGroup
{
public int Id { get; set; }
[Required(ErrorMessage = "The group must have a name.")]
public string Name { get; set; }
[Required(ErrorMessage = "The code is required.")]
public string Code { get;set; }
public string Description { get; set; }
[Display(Name="Members")]
public IList<string> StudentIds { get; set; }
}
问题是当我在调试器中运行它时,StudentIds总是为null,即使我单步执行它,ID也会被添加。 我是ASP.NET MVC的新手,所以请记住这一点。
答案 0 :(得分:0)
我认为您可以简化代码并使其工作如下:
var x = Request["groupCode"];
var affectedGroup = db.StudentGroups.FirstOrDefault(s => s.Code == x);
var groupId = affectedGroup.Id;
if (affectedGroup != null && !affectedGroup.Any())
{
affectedGroup.StudentIds = new List<string>();
affectedGroup.StudentIds.Add(loggedInUserId);
}
else if (affectedGroup.StudentIds.Contains(loggedInUserId))
{
TempData["ErrorMessage"] = "You are already a member of this group";
}
db.SaveChanges();
此外,您可能希望使用EntityState.Modified或EntityState.Add来确保EF了解更改。
答案 1 :(得分:0)
我建议使用交叉引用表来代替此功能。您可以让您的StudentGroup模型具有Id,Code,Name和Description字段;然后创建一个xStudentsInStudentGroup表,该表存储StudentId和StudentGroupId以将两者相关联。
您的其余代码将是半相似的。您仍然可以以相同的方式获取groupId,但是一旦拥有它,您可以从xStudentsInStudentGroup中提取所有学生ID并使用它们。
if(context.xStudentsInStudentGroup.Any(x => groupId == x.StudentGroupId && x.StudentId == loggedInUserId))
{
//Already in
}
else
{
var xStudent = new xStudentsInStudenGroup()
{
StudentId = loggedInUserId
StudentGroupId = GroupId
};
context.Insert(xStudent);//This depends on how you add new records
context.SaveChanges();
}
我还会研究如何设置控制器。您应该有一个基础,可以在每个操作中创建和处理新的数据库上下文。或者执行一个using语句,它将如前所述清理上下文。
- EDIT-- 我之所以不推荐你这样做的原因是因为你可以保存一个int列表并让它更新似乎没有意义。如果你在其他领域有这个工作,那么你的问题可能只是你将StudentIds对象作为字符串列表而不是整数。
答案 2 :(得分:0)
您似乎不使用EF延迟加载,因此在尝试接收组时,您必须使用Include方法明确包含学生ID:
import tweepy
# Consumer keys and access tokens, used for OAuth
consumer_key = 'XXXXXXXXXXX'
consumer_secret = 'XXXXXXXXXXX'
access_token = 'XXXXXXXXXXXX'
access_token_secret = 'XXXXXXXXXXX'
# OAuth process, using the keys and tokens
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
# Creation of the actual interface, using authentication
api = tweepy.API(auth)
# Sample method, used to update a status
api.update_status('Hello')