23

Tôi có một lớp thực thể cơ sở MyCompany.Core.Model.User mà là để được sử dụng cho tài sản chung của một thực thể User:Loại 'Company.Model.User' và gõ 'Company.Core.Model.User' cả hai đều có tên đơn giản cùng của 'Người dùng' và do đó không thể được sử dụng trong cùng một mô hình

public class User 
{ 
    public string Username { get; set; } 
    public string Usercode { get; set; } 
} 

tôi cũng có một lớp bản đồ cơ sở MyCompany.Core.Model.UserMap để thiết lập mã ánh xạ đầu tiên cho các cơ sở User lớp:

public class UserMap<TUser> : EntityMapBase<TUser> 
    where TUser : User 
{ 
    public UserMap() 
    { 
     // Primary Key 
     this.HasKey(t => t.Usercode); 

     // Table & Column Mappings 
     this.ToTable("Users"); 
     this.Property(t => t.Username).HasColumnName("Username"); 
     this.Property(t => t.Usercode).HasColumnName("UserCode"); 
    } 
} 

trong một riêng biệt assembly Tôi có một lớp dẫn xuất MyCompany.Model.User được thừa kế từ lớp cơ sở User và mở rộng nó với một số thuộc tính bổ sung:

public class User : Core.User 
{ 
    public string Surname { get; set; } 
} 

Bên cạnh đó tôi có một ánh xạ lớp có nguồn gốc MyCompany.Model.UserMap để cung cấp các cấu hình bổ sung cho các thuộc tính bổ sung:

public class UserMap : Core.UserMap<User> 
{ 
    public UserMap() 
    { 
     this.Property(t => t.Surname).HasColumnName("Surname"); 
    } 
} 

Tuy nhiên khi thêm MyCompany.Model.User vào ngữ cảnh và đăng ký MyCompany.Model.UserMap Tôi nhận được lỗi sau:

Các loại 'MyCompany.Model.User' và gõ 'MyCompany.Core.Model.User' cả hai đều có tên đơn giản cùng của 'Người dùng' và do đó không thể được sử dụng trong mô hình tương tự. Tất cả các loại trong một mô hình nhất định phải có tên đơn giản duy nhất. Sử dụng 'NotMappedAttribute' hoặc gọi Bỏ qua trong thông thạo API Mã đầu tiên để loại trừ một cách rõ ràng tài sản hoặc loại khỏi mô hình.

Điều này link cho biết bạn không thể có cùng một "tên đơn giản" trong mô hình hai lần.

Tại sao "tên đơn giản" của lớp cơ sở được đăng ký trong mô hình và có cách nào xung quanh nó để triển khai loại thừa kế thực thể này không?

Tôi nghi ngờ giải pháp đơn giản là đổi tên lớp được thừa kế; Tuy nhiên tôi muốn để tránh điều này vì có thể có nhiều Mục từ trong nhiều ngữ cảnh.

Lưu ý: Sử dụng Entity Framework 6.0.0-rc1 (phát hành trước)

+0

Im chiến đấu với cùng một thứ. Bạn đã đến một giải pháp? –

+0

@JasonCragun Thật không may là không. Tôi chỉ cần đổi tên lớp cơ sở thành UserBase. –

Trả lời

34

Đây là giới hạn của EF mà tôi đã báo cáo trong năm 2012 https://entityframework.codeplex.com/workitem/483 vẫn chưa được triển khai trong 6.0.2. EF sử dụng kiến ​​trúc nội bộ phẳng và không nhận ra không gian tên. Có thể đến trong EF7 nhưng không phải trước đây. Hiện tại, các giải pháp duy nhất là đổi tên hai lớp thành các tên lớp duy nhất bất kể không gian tên mà chúng nằm trong. IMHO, đây là một hạn chế đáng kể trong EF. Chỉ cần xem xét một lớp có tên Category và có bao nhiêu không gian tên khác nhau mà nó có thể được sử dụng trong một miền.

+11

Wow, chỉ cần vượt qua điều này. Đó là một giới hạn khá lớn. Khá nhiều lau ra toàn bộ khái niệm DDD của bối cảnh bị ràng buộc –

+4

Hạn chế rất khó chịu đối với tôi. Sau nhiều năm cố gắng thuyết phục bản thân mình để sử dụng EF thay vì NH, bây giờ bị mắc kẹt với vấn đề này. – Panji

+2

Lượt này ngày hôm nay bản thân mình. Tôi có một hệ thống với hai loại đơn đặt hàng hoàn toàn không có liên quan, được gọi là "PurchaseOrder". Bởi vì điều này, tôi cần phải đổi tên một trong các lớp học của tôi. Không hài lòng. – Yuck

0

Đầu đọc Table type mappings

Mô hình thực hiện phân cấp tùy chọn cần phải được hiểu trước tiên. Sau đó nhìn vào tùy chọn bỏ qua. Bạn có thể hoặc có thể không cần tùy thuộc vào cách tiếp cận đã chọn.
đòi hỏi bỏ qua ???

modelBuilder.Ignore<BaseXYZ>() 

Ef hiện đang cố gắng bao gồm lớp cơ sở của bạn để hỗ trợ Loại được thừa kế từ lớp trừu tượng NON.

+2

Tôi đã thử cả hai đề xuất của bạn. Bỏ qua lớp cơ sở không có hiệu lực và tôi vẫn gặp lỗi tương tự. Tương tự như vậy, việc thay đổi lớp người dùng cơ sở thành trừu tượng không có tác động. –

0

Để giữ cùng tên lớp, tôi khuyên bạn nên sử dụng các giao diện khác nhau. Một giao diện cho Core.Entity định nghĩa các thuộc tính chung và một giao diện khác cho các thuộc tính bổ sung. Vì vậy, thay vì sử dụng một lớp dẫn xuất bạn sử dụng một lớp thực hiện hai giao diện.

+0

Lý do có lớp dẫn xuất là giảm thiểu sự trùng lặp ánh xạ thực thể. –

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