2015-04-18 14 views
5

Tôi đang sử dụng Khung thực thể 6.1.1 và tôi có bảng Users và bảng User_Documents (1: nhiều). Tôi đã có tài sản điều hướng từ User_Documents đến User mọi thứ đã hoạt động tốt.Khung thực thể bị nhầm lẫn về thuộc tính điều hướng

public partial class User_Document 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public long User_Document_ID { get; set; } 

    public long User_ID { get; set; } 

    [ForeignKey("User_ID")] 
    public virtual User User { get; set; } 
} 

tôi đã thêm một tài sản chuyển hướng từ người sử dụng để User_Documents

public partial class User 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public long User_ID { get; set; } 

    [StringLength(50)] 
    public string Username { get; set; } 

    public virtual List<User_Document> Documents { get; set; } 
} 

và bây giờ tôi nhận được một lỗi khi tôi cố gắng để chạy các ứng dụng:

System.Data.Entity .ModelConfiguration.ModelValidationException: Một hoặc lỗi xác thực khác đã được phát hiện trong quá trình tạo mô hình:

User_Documents: Tên: Mỗi tên thành viên trong một EntityContainer phải là duy nhất. Thành viên có tên 'User_Documents' đã được xác định.

Tất nhiên có một bảng gọi là User_Documents nhưng không có bất động sản nào khác có tên đó. Tôi không chắc nó bị lẫn lộn bởi điều gì. Có lẽ nó lấy tên bảng "Người dùng" và tên thuộc tính "Tài liệu" và cố gắng tạo ra một cái gì đó gọi là "User_Documents" ra khỏi nó? Nếu tôi đổi tên nó để từ Documents để Some_Documents như thế này

public virtual List<User_Document> Some_Documents { get; set; } 

sau đó tôi nhận được một lỗi khác nhau trong đó nêu

System.InvalidOperationException: Mô hình sao bối cảnh các 'PipeTrackerContext' đã thay đổi kể từ khi cơ sở dữ liệu đã được tạo . Xem xét sử dụng Mã Đầu tiên Migrations để cập nhật cơ sở dữ liệu

Vì vậy, tôi chạy Add-Migration và tôi có được điều này:

public override void Up() 
{ 
    AddColumn("dbo.User_Documents", "User_User_ID", c => c.Long()); 
    CreateIndex("dbo.User_Documents", "User_User_ID"); 
    AddForeignKey("dbo.User_Documents", "User_User_ID", "dbo.Users", "User_ID"); 
} 

Tại sao nó cố gắng để thêm một cột mới có tên gọi User_User_ID? Tại sao tôi không thể thêm thuộc tính điều hướng Document như tôi muốn?

Trả lời

4

sử dụng InverseProperty Như thế này:

public partial class User_Document 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public long User_Document_ID { get; set; } 

    public long User_ID { get; set; } 

    [ForeignKey("User_ID")] 
    [InverseProperty("Documents")] 
    public virtual User User { get; set; } 
} 

Và:

public partial class User 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public long User_ID { get; set; } 

    [StringLength(50)] 
    public string Username { get; set; } 

    [InverseProperty("User")] 
    public virtual List<User_Document> Documents { get; set; } 
} 
+0

Bạn có thể giải thích vấn đề được giải quyết và cách giải quyết vấn đề này không? –

+1

Liên kết này có thể trợ giúp: https://msdn.microsoft.com/en-us/data/jj591583.aspx – Iraj

0

Tại sao nó cố gắng để thêm một cột mới có tên gọi User_User_ID? Tại sao tôi không thể chỉ cần thêm thuộc tính Điều hướng tài liệu như tôi muốn?

Theo quy ước, nó sẽ tạo ra chìa khóa nước ngoài như tablename_columnName đó là User_User_ID. Điều này xảy ra khi bạn xóa thuộc tính [ForeignKey("User_ID")] HOẶC không có thuộc tính khóa ngoài.

Nếu bạn thay đổi tên thuộc tính Documents thành tên khác (như UserDocuments), bạn sẽ không gặp phải xung đột tên này.

+0

Phải, nhưng nếu tôi đổi tên Tài liệu thành UserDocuments, nó vẫn muốn thêm trường được gọi là User_User_ID vào bảng Người dùng . Tại sao vậy? – d512

+0

Không. Thêm User_User_ID có liên quan đến thuộc tính khóa ngoài. Bạn có thuộc tính hoặc bạn đã xóa nó? –

+0

Dường như mã tôi đã đăng. Thuộc tính Người dùng trong bảng User_Documents có thuộc tính [ForeignKey] trên đó. – d512

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