实体框架多对多

时间:2012-10-20 15:02:14

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

public class Project
{


    public virtual int ID { get; set; }

    [Required]
    public virtual String Title { get; set; }


    public String Definition { get; set; }
    public DateTime StartDate { get; set; }


    [Required]
    public int CreaterID { get; set; }

    public virtual ICollection<Status> Status { get; set; }
    public virtual ICollection<Task> Tasks { get; set; }
    public virtual ICollection<User> Users { get; set; }

    public Project()
    {
        Users = new HashSet<User>();
    }


}


public class User
{
    public int ID { get; set; }


    [DisplayName("Kullanıcı Adı")]
    [Required]
    [MinLength(5, ErrorMessage = "Kullanıcı Adı En Az 5 Karakter Olmalıdır")]
    public string username { get; set; }

    [DataType(DataType.Password)]
    [DisplayName("Şifre")]        
    [Required]
    [MinLength(3,ErrorMessage="Şifre En Az  3 Karakter Olmalıdır")]
    public string password { get; set; }

    [Required]
    public String Name { get; set; }

    [Required]
    public String Surname { get; set; }

    public int? CreaterID { get; set; }
    public int level { get; set; }

    public ICollection<Task> Tasks { get; set; }
    public ICollection<Project> Projects { get; set; }

    public User()
    {
        Projects = new HashSet<Project>();
    }
}


public class TaskDB : DbContext
{
    public DbSet<Comment> Comments { get; set; }
    public DbSet<Project> Projects { get; set; }
    public DbSet<Situation> Situaitons { get; set; }
    public DbSet<Task> Tasks { get; set; }
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Project>().
          HasMany(c => c.Users).
          WithMany(p => p.Projects).
          Map(
           m =>
           {
               m.MapLeftKey("ProjectId");
               m.MapRightKey("UserId");
               m.ToTable("ProjectUser");
           });
    }

}

如果我添加项目,当前用户添加到项目用户列表但项目未添加当前用户的项目列表 这是我的项目添加代码

[HttpPost]
    public ActionResult Create(Project proje,Status status)
    {

        proje.StartDate = DateTime.Now;
        proje.Status = new HashSet<Status>();
        var user = _db.Users.Single(r=> r.ID == UserRole.ID);
        proje.Users.Add(user);
        proje.Status.Add(status);
        user.Projects.Add(proje);


        if (ModelState.IsValid)
        {
            var projeler = _db.Projects;
            projeler.Add(proje);
            _db.SaveChanges();

            return RedirectToAction("Index");

        }


            return View(proje);

    }

我搜索这个问题的原因我没找到,我想了解为什么实体框架将用户添加到项目列表但不将项目添加到用户列表

1 个答案:

答案 0 :(得分:0)

将新项目添加到数据库的代码看起来是正确的,并且很可能存储关系。

但您可能无法使用Projects加载User列表。如果你打电话......

var project = _db.Projects.Single(p => p.ID == 1);
var users = project.Users; // lazy loading because Users is virtual

...您将看到该项目的用户,因为他们延迟加载,因为Project.Users属性标记为virtual。如果您使用User ...

执行相同的操作
var user = _db.Users.Single(u => u.ID == 1);
var projects = user.Projects; // no lazy loading because Projects is not virtual

...项目未加载,因为User.Projects属性未标记为virtual

将属性标记为virtual以启用User.Projects集合的延迟加载:

public virtual ICollection<Project> Projects { get; set; }

或使用预先加载:

var user = _db.Users.Include(u => u.Projects).Single(u => u.ID == 1);