2013-06-27 41 views
7

Tôi cố gắng để thiết lập một mô hình Entity Framework với một tùy chọn: mối quan hệ không bắt buộc:Entity Framework tùy chọn: tùy chọn mối quan hệ

Trong trường hợp của tôi, đôi khi một bản ghi AdditionalData tồn tại mà điểm lên mức kỷ lục BaseTable, nhưng đôi khi BaseTable hoặc Các bản ghi AdditionalData tồn tại mà không có bất kỳ liên kết nào. Khóa ngoài của BaseTable (nếu nó tồn tại) nằm trên bảng AdditionalData.

Tôi muốn có thể điều hướng qua lại giữa BaseTable và bất kỳ AdditionalDatas nào có thể được kết nối.

BaseTable 0..1 ----- 0..1 AdditionalData1 
       \ 
        --- 0..1 AdditionalData2 


public class BaseTable { 
    public int Id { get; set; } 
    public virtual AdditionalType1 AdditionalType1 { get; set; } 
    public virtual AdditionalType2 AdditionalType2 { get; set; } 
}     

public class AdditionalType1 { 
    public int Id { get; set; } 
    public int? BaseTableId { get; set; } 
    public virtual BaseTable BaseTable { get; set; } 
} 

public class AdditionalType2 { 
    public int Id { get; set; } 
    public int? BaseTableId { get; set; } 
    public virtual BaseTable BaseTable { get; set; } 
} 

Làm thế nào để làm cho công việc này? Tôi đã như xa như:

modelBuilder.Entity<AdditionalType1>() 
    .HasOptional(zmt => zmt.BaseTable) 
    .WithOptionalDependent(zm => zm.AdditionalType1) 
    .Map(a => a.MapKey("BaseTableId")); 
modelBuilder.Entity<AdditionalType2>() 
    .HasOptional(zmt => zmt.BaseTable) 
    .WithOptionalDependent(zm => zm.AdditionalType2) 
    .Map(a => a.MapKey("BaseTableId")); 

nhưng nó nói với tôi điều này:

error: (1564,6) : error 0019: Each property name in a type must be unique. Property name 'BaseTableId' was already defined.

Tôi không biết chính xác những gì mà đề cập đến, và không chắc chắn làm thế nào để sửa chữa.

EDIT: Nếu tôi loại bỏ các khoản Map/MapKey như đề xuất ở đây (https://stackoverflow.com/a/8016308/237091) Tôi nhận được lỗi này thay vào đó, khi một truy vấn chạy sử dụng nó:

Invalid column name 'BaseTable_Id' as it maps itself to BaseTable_Id automatically instead of my BaseTableId field.

+1

'Đôi khi một BaseTable tồn tại' Hoặc bạn muốn tạo hàng trong bảng cơ sở cho người dùng hoặc bạn có một sự hiểu biết rất xấu về cách cơ sở dữ liệu hoạt động. Nó không giống như con mèo của Schrodinger, cho dù cơ sở dữ liệu của bạn có một Bảng đã được xác định tại thời điểm thiết kế. – MrFox

+0

@ Fox Fox: Đã được chỉnh sửa để làm rõ - Tôi đã nói về hồ sơ chứ không phải sự tồn tại thực sự của bảng. –

Trả lời

5

Dường như bạn đang cố gắng để thiết lập mối quan hệ 1: 0..1 từ các đối tượng AdditionalType của bạn (mà tôi có thể đã hiểu sai hoàn toàn.

NB Tôi nghĩ bạn sẽ phải giữ BaseTableId trên BaseTable để làm việc này (hoặc xác định khóa chính):

Nếu BaseTableId là chìa khóa nước ngoài trong trường hợp này, tôi nghĩ rằng đây có thể là những gì bạn đang sau:

modelBuilder.Entity<AdditionalType1>() 
    .HasOptional(zmt => zmt.BaseTable) 
    .WithMany() 
    .HasForeignKey(a => a.BaseTableId); 

Đó là những gì tôi đã sử dụng trước đó, nhưng không thể thừa nhận để hiểu nó hoàn toàn (các. WithMany() theo dõi tôi); đó là một giải pháp nhỏ được liệt kê trong bài viết từ câu trả lời này: Entity Framework 0..1 to 0 relation)

Xin lỗi nếu tôi đã bỏ lỡ toàn bộ điểm.

+1

có sử dụng cách tiếp cận này. đây là 1: Nhiều NHƯNG bạn arent buộc phải đặt nhiều mục trong ;-) tuyên bố 1: 1 sẽ yêu cầu bảng cơ sở và bổ sung để có cùng một khóa chính. Và một được đánh dấu là Chính. Vì vậy, sẽ cần phải thêm một kiểm tra tùy chỉnh hoặc thêm một chỉ số duy nhất để đảm bảo 1: 1 –

+0

Ah, quên đề cập đến một chỉ số duy nhất, Ta = D – Chris

+0

Xin lỗi, chỉ cần thêm Id prooperty. Tôi dự định sẽ có trường PK Id trên tất cả chúng, nhưng không phải là Khóa chính được chia sẻ vì lý do cũ. –

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