2012-10-20 245 views
3
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); 

    } 

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

回答

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);