2012-07-20 32 views
5

Tôi đang sử dụng các lớp sau cho một mối quan hệ một-nhiều:EF sử dụng mã đầu tiên với mối quan hệ tạo ra các phím nước ngoài một-nhiều trùng lặp

public class Supplier 
{ 
    public Supplier() 
    { 
     SupplierId = Guid.NewGuid(); 
    } 

    public Guid SupplierId { get; set; } 
    [Required] 
    public string Name { get; set; } 

    [Required] 
    public virtual Address Address { get; set; } 

    public virtual ICollection<Contact> Contacts { get; set; } 
} 

public class Contact 
{ 
    public Contact() 
    { 
     ContactId = Guid.NewGuid(); 
    } 

    public Guid ContactId { get; set; } 

    [Required] 
    public string FirstName { get; set; } 
    [Required] 
    public string LastName { get; set; } 

    [Required] 
    public Guid SupplierId { get; set; } 
    [ForeignKey("SupplierId")] 
    public virtual Supplier Supplier { get; set; } 
} 

Tôi đang sử dụng ASP.NET MVC 4 và khi tạo một Liên mới, SupplierID được thông qua trong chuỗi truy vấn và bổ sung vào hệ tạo hình như một lĩnh vực ẩn:

@Html.HiddenFor(model => model.SupplierId) 

Điều này tạo ra các hệ thành công và cư là lĩnh vực SupplierID của Tiếp xúc với các Guid từ chuỗi truy vấn. Tuy nhiên, vấn đề là bảng Danh bạ có một trường khác cho mối quan hệ Nhà cung cấp ảo có tên Supplier_SupplierId và trường này là NULL. Tôi không chắc tôi hiểu lý do tại sao Supplier_SupplierId thậm chí được tạo ra trên bảng Liên hệ, vì SupplierId nên được sử dụng làm khóa ngoại và điều này sẽ chỉ là thừa. Nếu tôi cố gắng truy cập vào bộ sưu tập Danh bạ của Nhà cung cấp mà tôi đã thêm thành công một Liên hệ vào, bộ sưu tập sẽ trở lại trống vì Contact.Supplier_SupplierId là NULL. Tuy nhiên, nếu tôi sao chép giá trị từ cột SupplierId vào cột Supplier_SupplierId của bản ghi Liên hệ, Supplier.Contacts sẽ mang lại Liên hệ.

Đây là những gì hệ bàn của tôi kết thúc lên trông như:

CREATE TABLE [dbo].[Contacts] (
    [ContactId]   UNIQUEIDENTIFIER NOT NULL, 
    [FirstName]   NVARCHAR (MAX) NOT NULL, 
    [LastName]   NVARCHAR (MAX) NOT NULL, 
    [Supplier_SupplierId] UNIQUEIDENTIFIER NULL, 
    CONSTRAINT [PK_dbo.Contacts] PRIMARY KEY CLUSTERED ([ContactId] ASC), 
    CONSTRAINT [FK_dbo.Contacts_dbo.Suppliers_SupplierId] FOREIGN KEY ([SupplierId]) REFERENCES [dbo].[Suppliers] ([SupplierId]), 
    CONSTRAINT [FK_dbo.Contacts_dbo.Suppliers_Supplier_SupplierId] FOREIGN KEY ([Supplier_SupplierId]) REFERENCES [dbo].[Suppliers] ([SupplierId]) 
); 

Có ai biết tại sao 2 phím nước ngoài để nhà cung cấp đang được tạo ra trong Danh bạ? Làm thế nào tôi có thể thay đổi nó để chìa khóa nước ngoài duy nhất cho các nhà cung cấp là SupplierId?

+0

Bạn có bản đồ nào với API thông thạo không? Bạn đã loại bỏ một số quy ước? Các lớp bạn đang hiển thị hoàn chỉnh hay có nhiều thuộc tính điều hướng hơn giữa 'Nhà cung cấp' và' Liên hệ'? – Slauma

+1

Tôi trọng chức năng OnModelCreating để sửa đường dẫn thác nhiều lỗi: modelBuilder.Entity () .HasRequired (r => r.Supplier) .WithMany() .HasForeignKey (f => f. SupplierId) .WillCascadeOnDelete (false); Tôi đã xóa một số thuộc tính đơn giản không áp dụng cho vấn đề này từ các lớp học, nhưng không có tham chiếu giữa các lớp. Chỉ có một-nhiều từ Nhà cung cấp đến Danh bạ. –

Trả lời

6

lập bản đồ này là sai (tôi đề cập đến nhận xét của bạn bên dưới câu hỏi của bạn):

modelBuilder.Entity<Contact>() 
    .HasRequired(r => r.Supplier) 
    .WithMany() 
    .HasForeignKey(f => f.SupplierId) 
    .WillCascadeOnDelete(false); 

Bạn cần:

modelBuilder.Entity<Contact>() 
    .HasRequired(r => r.Supplier) 
    .WithMany(s => s.Contacts) 
    .HasForeignKey(f => f.SupplierId) 
    .WillCascadeOnDelete(false); 

Nếu không EF sẽ xem xét Supplier.Contacts như một tài sản chuyển hướng thuộc về mối quan hệ một - nhiều thứ hai giữa SupplierContact - và giới thiệu khóa ngoại thứ hai.

+0

Cảm ơn bạn! Đó là thủ phạm. –

+0

Bạn đã chỉ ra chính xác cùng một sai lầm tôi đã thực hiện. Cảm ơn! –

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