2010-04-02 15 views
7

Tôi có một bảng Users và một bảng mụcSử dụng Nhiều Ngoại Keys để cùng một bảng trong LINQ

Trong bảng Items, tôi có các lĩnh vực như

ModifiedBy CreatedBy AssignedTo

mà tất cả đều có một số nguyên userId. Cơ sở dữ liệu được thiết lập để có các khóa ngoại này trở lại bảng Người dùng.

Khi sử dụng linqtosql, các mối quan hệ đó sẽ tự động được xây dựng từ dbml kết thúc đem lại cho tôi những cái tên như dùng, User1 và User2

ví dụ myItem.User1.Name hoặc myItem.User2.Name

Rõ ràng đây không phải là rất có thể đọc được và tôi muốn nó được dọc theo dòng

myItem.CreatedByUser.Name hoặc myItem.ModifiedByUser.Name vv

Tôi có thể thay đổi tên của các mối quan hệ nhưng điều đó có nghĩa là tôi phải làm lại mỗi khi tôi thay đổi lược đồ db và làm mới dbml.

Có cách nào vòng này không?

+0

http://blogs.vertigo.com/personal/petar/Blog/archive/2008/01/29/multi-field-foreign-key-relationship-to-the-same-database-table-and-linq .aspx Blog này đề cập đến cùng một vấn đề nhưng giải pháp không phù hợp với tôi vì tôi liên tục thay đổi lược đồ db của mình và không muốn phải thực hiện nhiều công cụ thủ công mỗi khi tôi thay đổi nó – Graeme

Trả lời

1

Câu trả lời đơn giản: Số

Có người đã đề xuất ý tưởng của việc tạo ra các lớp học Hiệp hội phần nơi tên thuộc tính được xác định, nhưng điều đó sẽ không làm việc, hoặc: Renaming LINQ 2 SQL Entity Properties Through Partial Classes.

Lựa chọn của bạn là dành một chút thời gian tìm hiểu thêm về LINQ-to-SQL "đằng sau hậu trường" để bạn có thể thực hiện các sửa đổi cần thiết hoặc chỉ thay đổi tên thuộc tính thông qua cửa sổ Thuộc tính. Cá nhân, tôi chỉ cần xóa/redrag/đổi tên, bởi vì không thiết lập một tài sản một cách chính xác là một nỗi đau để gỡ lỗi bởi vì các trường hợp ngoại lệ được ném cho bạn ít hoặc không có đầu mối như những gì gây ra nó. Tôi thậm chí đã đi xa như vậy để tạo ra một thư viện kiểm tra đơn vị nhận từng đối tượng MetaTable trong mô hình và xác minh số trường, nội dung ServerDataType của mỗi trường, số liên kết, tên của từng liên kết và tên của mỗi đầu của hiệp hội. Mỗi vài thay đổi, tôi chạy các bài kiểm tra đơn vị để đảm bảo rằng mô hình vẫn còn nguyên vẹn.

1

Thứ nhất, không ... tên được tạo dựa trên bảng thứ hai trong mối quan hệ.

Nhưng những gì bạn cần biết là bạn không phải "làm mới" (có nghĩa là, xóa bảng trong DBML sau đó kéo và thả lại bảng).

Đối với dự án tôi đang làm việc, chúng tôi có hơn 200 bảng ... khoảng 50 trong số đó chúng tôi đã tinh chỉnh thủ công sau khi kéo chúng từ cơ sở dữ liệu. Chúng tôi không bao giờ xóa và kéo lại các bảng vì đã có quá nhiều thay đổi sau khi tạo tự động.

+0

Đối với tôi , thì tốt hơn là xóa và redrag vì ít nhất, việc áp dụng các thay đổi là nhất quán dựa trên công cụ SqlMetal. Tôi muốn sử dụng cửa sổ Properties để thay đổi một vài tên thay vì bỏ lỡ thiết lập một thuộc tính AutoSync, bởi vì các ngoại lệ được đưa ra cho bạn rất ít đầu mối về cách giải quyết nó. –

+0

Với mỗi của riêng mình :) ... nó không phải là một hệ thống hoàn hảo (LINQ to SQL đó là), vì vậy bất cứ điều gì là dễ nhất cho bạn thực sự là câu trả lời. Chúng tôi đã làm nó theo cách tương tự như bạn, nhưng cuối cùng nó đã ra khỏi tầm tay. –

0

Bạn có thể sử dụng LINQ to sql mà không có dbml nó có thể là công việc phụ trả trước nhưng từ góc độ thay đổi thành tên cột bảng có thể dễ dàng hơn thay đổi đối với dbml như bạn đã mô tả.

0

Tôi khuyên bạn nên tạo các phương thức tiện ích mở rộng ánh xạ các tên bạn muốn các tên bạn nhận được từ mã được tạo tự động. Bằng cách đó sau mỗi lần tạo tự động, bạn không phải thay đổi mã được tạo tự động mà chỉ có các phương thức mở rộng của riêng bạn. Điều đó, cộng với các bài kiểm tra đơn vị để làm kiểm tra sanity như đề xuất ở những nơi khác trên trang này sẽ hoạt động tốt.

Tôi vừa mới gặp phải sự cố này và tôi đang cố gắng thực hiện đề xuất của riêng mình.

EDIT: Điều này có vẻ liên quan: SQLMetal Multiple Foreign Keys Pointing to One Table Issue

1

Tôi chỉ cần thêm một lớp học phần nhỏ để mở rộng đối tượng với các thuộc tính được đặt tên phù hợp, ví dụ dưới đây:

namespace Database.TableModels { 
    partial class WTSR_Induction { 
     public EmailTemplate ConfirmationEmailTemplate { 
      get { return EmailTemplate1; } 
     } 
     public EmailTemplate InviteEmailTemplate { 
      get { return EmailTemplate; } 
     } 
    } 
} 

Trong ví dụ này, bảng WTSR_Inductions có hai liên kết đến bảng EmailTemplates, do đó thuộc tính EmailTemplateEmailTemplate1.

+0

Đó là loại xấu xí nhưng có lẽ là giải pháp tốt nhất trong nhiều trường hợp. –

1

Một chút trễ nhưng bạn có thể thực hiện việc này bằng cách chọn mối quan hệ trên mô hình LINQ và chuyển đến các thuộc tính và cập nhật tên thuộc tính cha mẹ.

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