对未注册的实体的更改

时间:2015-04-22 15:51:04

标签: c# asp.net asp.net-mvc

我正在尝试更新我的某个实体中的列表。这就是我正在做的事情:

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的新手,所以请记住这一点。

3 个答案:

答案 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')