9

Trong dự án AspNet MVC 3 của tôi khi tôi cố gắng dàn dựng một thực thể có mối quan hệ One to Zero hoặc One với một pháp nhân khác tôi nhận được "Một mục có cùng một chỉ mục đã được thêm vào "lỗi.Giàn giáo MVC và lỗi liên kết 'One To Zero hoặc' của EF

Điều này xảy ra khi Khóa chính của bảng có liên quan cũng là Khóa ngoại.

Tại thời điểm này workaround của tôi là

  1. Thêm một cột Id vào bảng có liên quan và làm cho nó chính chủ chốt

  2. Thêm phím độc đáo cho cột chính nước ngoài.

Vấn đề với điều này là EF sẽ tạo ra một tài sản ICollection chuyển hướng cho các đơn vị có liên quan thay vì chỉ là một tài sản của loại thực thể có liên quan (mà tôi có thể thiết lập để null trong trường hợp không tổ chức liên quan)

Đây có phải là lỗi không?

Tôi có làm gì sai không?

Có cách nào tốt hơn để loại bỏ thuộc tính điều hướng ICollection không?

+0

Bạn có đang sử dụng tạo mã DbContext không? –

+0

Tôi đang sử dụng DbContext trong EF 4.3 và có cùng một vấn đề. Ứng dụng của tôi sử dụng Code First để tạo DB. Dường như, trong Mike

+0

Bạn cũng nên sử dụng khóa ngoài của bảng có liên quan làm khóa chính - đó là cách duy nhất để thực hiện mối quan hệ 1- (0,1). –

Trả lời

3

Xem câu trả lời của tôi về câu hỏi này:

How do I code an optional one-to-one relationship in EF 4.1 code first with lazy loading and the same primary key on both tables?

Đó là mã ví dụ với cấu hình chính xác.

public class ZoneMedia 
{ 
    public int ZoneMediaID { get; set; } 
    public string MediaName { get; set; } 
    public int Width { get; set; } 
    public int Height { get; set; } 

    public virtual ZoneMediaText MediaText { get; set; } 
} 

public class ZoneMediaText 
{ 
    public int ZoneMediaID { get; set; } 
    public string Text { get; set; } 
    public int Color { get; set; } 

    public virtual ZoneMedia ZoneMedia { get; set; } 
} 

public class TestEFDbContext : DbContext 
{ 
    public DbSet<ZoneMedia> ZoneMedia { get; set; } 
    public DbSet<ZoneMediaText> ZoneMediaText { get; set; } 

    protected override void OnModelCreating (DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<ZoneMedia>() 
      .HasOptional(zm => zm.MediaText); 
     modelBuilder.Entity<ZoneMediaText>() 
      .HasKey(zmt => zmt.ZoneMediaID); 
     modelBuilder.Entity<ZoneMediaText>() 
      .HasRequired(zmt => zmt.ZoneMedia) 
      .WithRequiredDependent(zm => zm.MediaText); 

     base.OnModelCreating(modelBuilder); 
    } 
} 
class Program 
{ 
    static void Main (string[] args) 
    { 
     var dbcontext = new TestEFDbContext(); 
     var medias = dbcontext.ZoneMedia.ToList(); 
    } 
} 

Bạn cũng có thể đạt được điều này với DataAnnotations, nhưng tôi thường giữ mô hình tổ chức của mình là POCOs.

+0

Cảm ơn và xin lỗi đã không có thời gian để nhìn vào điều này nhưng nó có vẻ tốt. Xin lỗi vì đã chấp nhận chậm trễ. – NVM

+0

Luôn sẵn lòng hữu ích;) – WDRust

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