2012-12-07 10 views
13

Tôi đang sử dụng EntityFramework phiên bản 5.0 trong dự án WinForms, .net 4.5.Tôi cần thêm gì vào hàm OnModelCreating (DbModelBuilder modelBuilder) để xác định quan hệ giữa Person và Role?

Tôi đã tạo ra 2 đối với tôi Đối tượng quan trọng

public class Role 
    { 
     [Key] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public bool StockPermission { get; set; } 
     public bool ItemPermission { get; set; } 
     public bool OrderPermission { get; set; } 
     public bool PersonPermission { get; set; } 
     public bool StatisticPermission { get; set; } 
    } 

    public class Person 
    { 
     [Key] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int Id { get; set; } 
     public String Name { get; set; } 
     public String Nickname { get; set; } 
     public String Contact { get; set; } 
     public System.DateTime Created { get; set; } 
     public String Pincode { get; set; } 

     public virtual ICollection<Role> Role { get; set; } 
     public virtual Person Creator { get; set; } 
    } 

và lớp dbContext:

public class SusibarDbContext : DbContext 
    { 
     public DbSet<Entity.Role> Roles { get; set; } 
     public DbSet<Entity.Person> Persons { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      //base.OnModelCreating(modelBuilder); 
     } 
    } 

xin vui lòng, bạn có thể giúp tôi những gì tôi cần phải thêm vào OnModelCreating(DbModelBuilder modelBuilder) chức năng để xác định mối quan hệ giữa người và Vai trò?

Người có thể có nhiều Vai trò (nhưng không thể là null), những người khác nhau có thể có cùng một vai trò.

Person có thể có một "tác giả" Person (có thể null), Người khác nhau có thể có cùng một "tác giả"

Nếu bạn có thể có lòng tốt, chỉ cần tư vấn cho tôi giải pháp :-(

+0

Ok, tôi đã giải quyết nó! trong vài phút tôi sẽ thêm giải pháp (ăn trưa trước) – eCorke

Trả lời

13

Nếu bạn muốn sử dụng API thông thạo cho nó, hãy xem this topic từ MSDN. Bạn nên sử dụng mối quan hệ Nhiều-với-Nhiều và EF sẽ tạo ra một bảng cần thiết cho trường hợp khi Người có thể có nhiều Vai trò và Vai trò có nhiều Người. Một cái gì đó như thế này:

modelBuilder.Entity<Person>().HasMany(x => x.Roles).WithMany(); 

Bạn cũng có thể tạo mối quan hệ này mà không cần sử dụng API thông thạo. Bạn nên tạo thuộc tính điều hướng ICollection<Person> Persons trong lớp Vai trò và EF cũng sẽ tạo ra bảng và mối quan hệ thích hợp.

+0

cảm ơn rất nhiều, đây là những gì tôi đang tìm kiếm. – eCorke

1

Cái gì đó như điều này sẽ thực hiện công việc:.

Tạo một POCO gọi PersonRole này được thiết kế để mô hình hóa mối quan hệ giữa một PersonRole

public class PersonRole 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public Person Person { get; set; } 
    public Role Role { get; set; } 
} 
012.

Trong lớp Person, thay thế:

public virtual ICollection<Role> Role { get; set; } 

với:

public virtual ICollection<PersonRole> PersonRoles { get; set; } 

Nếu bạn muốn, bạn có thể thêm dòng sau vào lớp Role:

public virtual ICollection<PersonRole> PersonRoles { get; set; } 

làm như vậy là tùy chọn, mặc dù nó có thể hữu ích nếu bạn muốn xem tất cả People với một số khác nhau Role.

Trong phương pháp OnModelCreating, hãy sử dụng mã này để đảm bảo rằng PersonRole sẽ thực thi các thuộc tính không thể vô hiệu hóa PersonRole.

modelBuilder.Entity<PersonRole>().HasRequired(p => p.Person); 
modelBuilder.Entity<PersonRole>().HasRequired(p => p.Role); 

Edit:

Lý do cho việc tạo các PersonRole POCO là để đảm bảo rằng một Role có thể được tái sử dụng những người dùng khác. Sử dụng public virtual ICollection<Role> Role { get; set; } hiện tại sẽ hoạt động, nhưng có thể nó sẽ không hoạt động như dự định.

Với mối quan hệ public virtual ICollection<Role> Role { get; set; }, những gì EF sẽ làm là tăng thêm bảng Role với một trường bổ sung, ví dụ, PersonId, mà sẽ được sử dụng để liên hệ một Person-Roles của họ. Vấn đề với điều này là rõ ràng: không có bảng PersonRole liên kết, bạn sẽ không thể cung cấp cho hai người cùng một Role.

+0

cảm ơn lời khuyên của bạn, nhưng tôi không nghĩ rằng đây là ý tưởng tốt nhất. Tạo thực thể quan hệ trong mô hình đã nhập thực thể. EntityFramework nên đưa ra các vấn đề về quan hệ, không tạo ra một vấn đề mới và các thực thể mới. – eCorke

+0

@eCorke xem chỉnh sửa của tôi. –

+0

Không có giải pháp nào khác? Một số loại thiết lập, rằng một vai trò có thể có nhiều người (realtion một đến nhiều, nhưng làm cho người có vai trò đó trong danh sách? Tôi biết làm thế nào để tạo ra nó với thực thể, nhưng tôi nghĩ rằng điều này có thể tạo ra Entity Framework backened. – eCorke

1

Mặc dù không trả lời trực tiếp câu hỏi của bạn, hãy sử dụng quy ước đặt tên EF để tránh Annotaions và giữ cho lớp học thực thể của bạn sạch sẽ. Tôi sẽ chứng minh 2 tình huống:

Một - Nhiều bằng EF Naming Convention

Vai trò có Nhiều Người, Người có một Role

Một - Nhiều đâu Không ước đặt tên Tồn tại (Parent-Child của cùng một loại)

Người đã nhiều Created, Người có một Đấng tạo Hóa)

public class Role 
{ 
    public int RoleId { get; set; } 
    public string Name { get; set; } 
    ... 

    public virtual ICollection<Person> Persons { get; set; } 
} 

public class Person 
{ 
    public int PersonId { get; set; } 
    public int CreatorId { get; set; } 
    public int RoleId { get; set; } 
    ... 

    public virtual Role Role { get; set; } 
    public virtual Person Creator { get; set; } 
    public virtual ICollection<Person> Created { get; set; } 
} 

Đối với mối quan hệ Đấng Tạo Hóa đã tạo trong OnModelCreating:

modelBuilder.Entity<Person>() 
    .HasOptional(p => p.Creator) 
    .WithMany(p => p.Created) 
    .HasForeignKey(p => p.CreatorId); 

Với "ClassName" + "Id" (trường hợp nhạy cảm), EF sẽ cho rằng nó là Primary Key/Nhận dạng tự động. Mối quan hệ Vai trò-Người sẽ được tạo tự động do Ánh xạ ảo được kết hợp với PrimaryKey "RoleId"

Các vấn đề liên quan