2013-07-15 38 views
5

XIN KIỂM TRA CÓ THỂ GIẢI PHÁP PHẦN DƯỚIKhông thể Xác định End Principal - Entity Framework Mã Đầu Mối quan hệ

Tôi gặp sự cố với một mối quan hệ chính nước ngoài - đây là bảng của tôi:

public class Lead 
{ 
    [Key] 
    public int LeadId { get; set; } 
    public int? CustomerId { get; set; } 

    [ForeignKey("CustomerId")] 
    public virtual Customer Customer { get; set; } 
} 

public class Customer 
{ 
    [Key] 
    [Column("customer_id")] 
    public int CustomerId { get; set; } 

    [ForeignKey("CustomerId")] 
    public virtual Lead Lead { get; set; } 

} 

tôi m gặp sự cố khi tôi nhận được lỗi này:

Unable to determine the principal end of an association between the types 'Sales.Customers.Customer' and 'Sales.Leads.Lead'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations. 

Tôi đã thử thêm mối quan hệ vào trình tạo mô hình nhưng nó đã appe ars rằng nó không hoạt động đúng. Khi tôi nhận được thông báo lỗi để biến mất nó thực sự sử dụng Lead.LeadId -> Customer.CustomerId làm mối quan hệ thay vì quan hệ Lead.CustomerId -> Customer.CustomerId.

Tôi đã kiểm tra các câu hỏi tương tự trên Stackoverflow nhưng dường như chúng không khớp với cấu trúc DB của tôi và khi tôi cố gắng triển khai các đề xuất của họ, mối quan hệ vẫn không hoạt động đúng.

Thật kỳ lạ - sẽ đánh giá cao sự trợ giúp về điều này!

CẬP NHẬT

Vì vậy, trong nỗ lực của tôi để có được mối quan hệ này để làm việc tôi đã chuyển các phím xung quanh theo cách sau:

public class Lead 
{ 
    [Key] 
    public int LeadId { get; set; } 

    [ForeignKey("LeadId")] 
    public virtual Customer Customer { get; set; } 
} 

public class Customer 
{ 
    [Key] 
    [Column("customer_id")] 
    public int CustomerId { get; set; } 
    public int? LeadId { get; set; } 

    [ForeignKey("LeadId")] 
    public virtual Lead Lead { get; set; } 
} 

Tuy nhiên, cùng một lỗi, vẫn không có may mắn - tôi thực sự mất mát tại sao mối quan hệ này không hiệu quả. Đối với tôi nó có vẻ khá thẳng về phía trước.

UPDATE 2

Ok - sau một TÔN của thời gian lãng phí rối tung với điều này tôi đã cố gắng một cách tiếp cận hơi khác nhau:

Dưới đây là các lớp học mới của tôi ....

public class Lead 
    { 
     [Key, ForeignKey("Customer")] 
     public int LeadId { get; set; } 
     public virtual Customer Customer { get; set; } 
    } 

    public class Customer 
    { 
     [Key] 
     [Column("customer_id")] 
     public int CustomerId { get; set; } 
     public int? LeadId { get; set; } 
     public virtual Lead Lead { get; set; } 
    } 

Không có thêm thông báo lỗi nào với mã ở trên! Vấn đề duy nhất là khung thực thể mối quan hệ đang tạo ra là giữa Customer.CustomerId và Lead.LeadId thay vì Customer.LeadId và Lead.LeadId - tôi cảm thấy như tôi là SO CLOSE!

CÓ THỂ GIẢI PHÁP

Ok - vì vậy sau khi một số nghiên cứu thêm Tôi đã xem qua bài viết này ở đây: EF Code First - 1-to-1 Optional Relationship

tôi sửa đổi các lớp học của tôi như thế này:

public class Customer 
{ 
    [Key] 
    [Column("customer_id")] 
    public int CustomerId { get; set; } 

    public virtual Lead Lead { get; set; } 
} 

public class Lead 
{ 
    [Key] 
    public int LeadId { get; set; } 
    public virtual Customer Customer { get; set; } 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Customer>().HasOptional<Lead>(l => l.Lead).WithOptionalDependent(c => c.Customer).Map(p => p.MapKey("LeadId")); 
    base.OnModelCreating(modelBuilder); 
} 

Tất cả mọi thứ hoạt động tuyệt vời! Nhưng một vấn đề lớn ...

Tôi phải xóa thuộc tính LeadId khỏi Bảng khách hàng .... vì vậy hiện tại tôi không chắc chắn cách tôi có thể chỉ định LeadId khi tạo Khách hàng mới (khi thích hợp) nếu có không có thuộc tính LeadId để gán cho?

+0

Chỉ cần chắc chắn trước khi tôi đào sâu hơn, bạn có ý định rằng đây là một mối quan hệ một-một giữa Khách hàng và Lead? – Tim

+0

Vâng ... yea - đó là chính xác - tuy nhiên, không có khách hàng tiềm năng cần thiết cho khách hàng - khách hàng có thể được nhập vào hệ thống mà không phải là khách hàng tiềm năng trước - biết ý tôi là gì? cũng - có thể có khách hàng tiềm năng mà không có khách hàng, như một khách hàng tiềm năng không chuyển đổi thành khách hàng – 99823

+1

Tôi đã hiểu. Chỉ muốn chắc chắn rằng bạn đã không đi cho một một-nhiều. Bởi vì đó là một con thú khác. Lemme look ... – Tim

Trả lời

2

Đăng nội dung này bằng API thông thạo, nó sẽ hoạt động.

public class Lead 
{ 
    [Key] 
    public int LeadId { get; set; } 

    public virtual Customer Customer { get; set; } 
} 

public class Customer 
{ 
    [Key] 
    [Column("customer_id")] 
    public int CustomerId { get; set; } 

    public virtual Lead Lead { get; set; } 
} 

builder.Entity<Lead>() 
.HasOptional(l => l.Customer) 
.WithOptionalPrincipal() 
.Map(k => k.MapKey("LeadId")); 

builder.Entity<Customer>() 
.HasOptional(c => c.Lead) 
.WithOptionalPrincipal() 
.Map(k => k.MapKey("CustomerId")); 

EDIT

Tables

+0

Ok - vì vậy tôi nhận được một lỗi mới: "Cột không xác định 'Extent10.LeadId' trong 'danh sách trường" - có vẻ như đang tạo thuộc tính mới dựa trên mã trình xây dựng mô hình trên Bảng khách hàng ... nó đang cố gắng chọn ect LeadId từ bảng khách hàng khi lead_id là tên cột thực tế trong bảng đó .. tên thật của nó .. – 99823

+0

'Extent10'.'customer_id', ' Extent10'.'lead_id', 'Extent10'.'company_name', 'Extent10'.'primary_customer_account_id', ' Extent10'.'website_address', 'Extent10'.'Status', ' Extent10'.'investigation_criteria', 'Extent10'.'administrative_criteria', ' Extent10'.' credit_hold', 'Extent10'.'paperwork_on_file', ' Extent10'.'gets_partial', 'Extent10'.'create_datetime', ' Extent10'.'edit_datetime', 'Extent10'.'LeadId' <- đây cột không tồn tại – 99823

+0

thực sự tôi nghĩ rằng tôi có thể đã giải quyết rằng ... bỏ qua trên – 99823

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