10

Tôi có mô hình Người dùng và mô hình Sự kiện trong dự án của mình. Sự kiện có người sáng tạo (Người dùng) và có người tham gia (Người dùng) để Sự kiện có mối quan hệ một-nhiều với Người dùng và cũng là mối quan hệ nhiều - nhiều với cùng một bảng.Mã khuôn khổ thực thể Đầu tiên: Mối quan hệ một-nhiều và nhiều người với cùng một bảng

tôi đã lần đầu tiên một-nhiều mối quan hệ như thế này:

Public class Event 
{ 
     ... 
     public int CreatedById { get; set; } 
     public virtual User CreatedBy { get; set; } 
     ... 
} 

Sau đó, khi tôi đã thêm các mối quan hệ nhiều-nhiều sự di chuyển không tạo ra nhiều mối quan hệ:

Public class User 
{ 
     ... 
     public virtual ICollection<Event> Events { get; set; } 
     ... 
} 

Public class Event 
{ 
     ... 
     public int CreatedById { get; set; } 
     public virtual User CreatedBy { get; set; } 
     public virtual ICollection<User> Users { get; set; } 
     ... 
} 

Nếu tôi xóa mối quan hệ một-nhiều thì di chuyển tạo ra mối quan hệ nhiều thành công.

Có cách nào để thực hiện điều này chỉ với chú thích dữ liệu không?

+0

Bạn @slauma đúng, tha tiếng anh của tôi, không phải là ngôn ngữ mẹ đẻ của tôi, tôi chỉ cố gắng làm hết sức mình. – Escobar5

+0

Tôi đã chỉnh sửa nó, hy vọng rõ ràng hơn – Escobar5

+0

Tôi không có nghĩa là một ngôn ngữ, nhưng nội dung (nếu có bất kỳ thông báo lỗi hoặc ngoại lệ, vv hoặc nếu kết quả không phải là những gì bạn mong đợi, vv). Dù sao, không bao giờ, vấn đề dường như đã được giải quyết rồi :) – Slauma

Trả lời

15

EF không biết địa điểm User.Events phải được ánh xạ tới. Nó có thể là Event.CreatedBy hoặc có thể là Event.Users. Cả hai sẽ dẫn đến một mô hình hợp lệ. Bạn phải cung cấp cho EF một chút gợi ý những gì bạn muốn bằng cách áp dụng các thuộc tính [InverseProperty]:

public class User 
{ 
    ... 
    [InverseProperty("Users")] 
    public virtual ICollection<Event> Events { get; set; } 
    ... 
} 
+0

Hoàn hảo! Điều đó là vậy đó – Escobar5

8

Với cách tiếp cận Mã Trước tiên, tôi sẽ luôn luôn khuyên bạn nên sử dụng API thông thạo hơn là sử dụng DataAnnotations, Trong đó sử dụng một số chuyển đổi tự động.

Bằng cách này, bạn sẽ biết cấu hình chính xác mà bạn đã thực hiện.

Nếu tôi là bạn, đây là những gì tôi sẽ sử dụng:

public class EventMap : EntityTypeConfiguration<Event> 
{ 
    public EventMap() 
    { 
     this.HasRequired(m => m.CreatedBy) // envent must have a creator 
      .WithMany() // a user can have 0,1 or more events created by him 
      .HasForeignKey(m => m.CreatedById) // specify property to be used as FK 
      .WillCascadeOnDelete(true); // delete all events created by user if that specific user is deleted 

     this.HasMany(m=>m.Users) // an event can have 0,1 or more participants 
      .WithMany(m=>m.Events) // a user can be a participant in 0,1 or more events     
      .Map(m => m.MapLeftKey("EventId").MapRightKey("UserId")); // this will generate intermediate table to hold participant information - dbo.EventUser with EventId & UserId 
      // Cascade Delete is always true for Many to Many mapping. however, it doesn't delete entry in other table, it deletes entry in Joined Table only. 
    } 
} 
Các vấn đề liên quan