2012-10-20 246 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);