首先关于mvc3实体代码的关系

时间:2011-11-08 22:25:24

标签: asp.net-mvc-3 entity-framework

我的项目有两个对象:用户和会议

每次会议都有一个用户是会议的“头”,而有许多用户都很简单。

我的模特是这些:

public class Meeting
{
    public int MeetingId { get; set; }
    public string Title { get; set; }
    public virtual User User { get; set; }
    public Location From { get; set; }
    public Location To { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

public class Location
{
    public float Lat { get; set; }
    public float Long { get; set; }
}

public class User
{
    public int UserId { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
}

我为会议模型创建了一个控制器。现在每次我添加另一个会议a并在用户字段中我放置一个现有的用户ID,不插入该用户并创建新用户。

怎么了?

修改 创建控制器

[HttpPost]
    public ActionResult Create(Tremp tremp)
    {
        if (ModelState.IsValid)
        {
            db.Tremps.Add(tremp);
            db.SaveChanges();
            return RedirectToAction("Index");  
        }

        return View(tremp);
    }

在表单中我只输入用户的ID

2 个答案:

答案 0 :(得分:0)

我首先不是EF代码的专家,但你的代码示例确实给我带来了一些似曾相识的感觉。我认为问题是你需要配置“头”用户和会议之间的关系,例如

public class Meeting
{
    public int MeetingId { get; set; }
    public string Title { get; set; }

    [ForeignKey("UserId")]
    public virtual User User { get; set; }

    [Column(name: "UserId")]
    public int HeaderUserId { get; set; }

    public Location From { get; set; }
    public Location To { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

答案 1 :(得分:0)

如果您的tremp实体具有对现有用户(tremp.User)的引用,则必须在添加tremp之前将此用户附加到上下文。这告诉EF该用户存在于数据库中并避免插入新用户:

[HttpPost]
public ActionResult Create(Tremp tremp)
{
    if (ModelState.IsValid)
    {
        db.Users.Attach(tremp.User);
        db.Tremps.Add(tremp);
        db.SaveChanges();
        return RedirectToAction("Index");  
    }

    return View(tremp);
}