2013-11-25 53 views
0

我試圖通過引入第四個關係,如SQL ,但當我運行'更新數據庫'的錯誤發生:'FK ... dbo.ProjectUsersRoles用戶標識導致週期或多個級聯路徑'。 我已經嘗試過屬性和Fluent Api,但結果是一樣的 - 錯誤。也許有人有類似的錯誤或問題。這裏是代碼:實體框架代碼第一:多對多(> = 3)

public class Project 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public virtual ICollection<ProjectUserRole> UsersRoles { get; set; } 
} 
public class User 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public virtual ICollection<ProjectUserRole> RolesOnProject { get; set; } 
} 
public class Role 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public virtual ICollection<ProjectUserRole> UsersProjects { get; set; } 
} 
public class ProjectUserRole 
{ 
    [Key] 
    public int UserId { get; set; } 
    [Key] 
    public int ProjectId { get; set; } 
    [Key] 
    public int RoleId { get; set; } 


    public User User { get; set; } 

    public Project Project { get; set; } 

    public Role Role { get; set; } 
} 

非常感謝您的幫助!

+0

如果您從'Project','Role'和'User'中取出對「ProjectUserRole」的引用,它會起作用嗎? –

+0

是的,它的確如此。我知道這是因爲這些關係,但爲什麼? – Romko

+1

我對EF不太熟悉。但是你確實有一個'A => B'和'B => A'循環參考問題(例如'ProjectUserRole'引用'User'和'User'引用'ProjectUserRole')。不知道在EF中如何實現這一切,但看起來它可能是一個問題。希望有人會給出一個更好的解釋,爲什麼這不起作用。 –

回答

0

只是在另一個方向使它

modelBuilder.Entity<ProjectUserRole>() 
      .HasRequired(x => x.Project) 
      .WithMany(x => x.UsersRoles) 
      .HasForeignKey(x => x.ProjectId) 
      .WillCascadeOnDelete(true); 
     modelBuilder.Entity<ProjectUserRole>() 
      .HasRequired(x => x.User) 
      .WithMany(x => x.RolesOnProjects) 
      .HasForeignKey(x => x.UserId) 
      .WillCascadeOnDelete(true); 
     modelBuilder.Entity<ProjectUserRole>() 
      .HasRequired(x => x.Role) 
      .WithMany(x => x.ProjectsUsers) 
      .HasForeignKey(x => x.RoleId) 
      .WillCascadeOnDelete(true); 

希望這將有助於人。 WillDeleteOnCascade點linking

的問題也可能在多個級聯鏈相同的表(該表可在級聯鏈中只能出現一次 - 這是不是一個codefirst而是MSSQL問題)

1

您是否試過指定cascadeOnDelete屬性? 你必須用流利的配置,像這樣做:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

     modelBuilder.Entity<User>() 
      .HasMany(u => u.RolesOnProject).WithRequired() 
      .WillCascadeOnDelete(false); 

     modelBuilder.Entity<Project>() 
      .HasMany(u => u.UsersRoles).WithRequired() 
      .WillCascadeOnDelete(false); 

     modelBuilder.Entity<Role>() 
      .HasMany(u => u.UsersProjects).WithRequired() 
      .WillCascadeOnDelete(false); 

    } 

這種方法應該是在你的DbContext類。正如你所看到的,我將它們全部設置爲不級聯刪除。你將不得不玩這個來做它想做的事。

------- *** ***編輯------

我沒有測試過這一點,但如果你想級聯刪除刪除項目時,我相信這將是配置。但是,您可以考慮手動處理級聯刪除。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

     modelBuilder.Entity<User>() 
      .HasMany(u => u.RolesOnProject).WithRequired() 
      .WillCascadeOnDelete(false); 

     modelBuilder.Entity<Project>() 
      .HasMany(u => u.UsersRoles).WithRequired() 
      .WillCascadeOnDelete(true); // Changed this.. 

     modelBuilder.Entity<Role>() 
      .HasMany(u => u.UsersProjects).WithRequired() 
      .WillCascadeOnDelete(false); 

    } 
+0

但是如果我想刪除ProjectId中ProjectUserRole的實體,例如當我刪除相應的Project時,該怎麼辦? – Romko

+1

請參閱編輯。此鏈接也可能有幫助 - > http:// alanfeekery。com/2013/10/25/entity-framework-cascade-delete/ – Zaphod

1

對不起,我誤解了你的刪除方向。

我只是想補充一點小心。請注意,現在執行刪除操作可能會在數據庫中留下不可用的數據。例如:如果用戶需要RolesOnProjects列表中的項目在應用程序中可用。刪除級聯刪除用戶需要的ProjectUserRole的角色將導致用戶無效(因爲RolesOnProjectList現在爲空)。這對你來說可能不是問題,但記住它。

(我不能添加評論(沒有50代表),所以我會在這裏回答。)

+0

感謝您的解釋和澄清!是的,這對我來說不是問題,因爲所有三個(項目,用戶和角色都很複雜),所以如果沒有其中一個,我不需要這些關係 – Romko

0

大,你有它排序。 請將問題標記爲已回答。

相關問題