2013-07-02 48 views
30

tôi đang gặp rắc rối cấu hình một mối quan hệ khóa ngoại trong Entity Framework Api thạo của tôi:vấn đề tạo ra một mối quan hệ ngoại-Key trên Entity Framework

Dưới đây là người đứng đầu của báo cáo:

public class Testata 
{ 
    public Testata() { Details = new List<Dettaglio>(); } 
    public virtual int IDTEST { get; set; } 
    public virtual string Value { get; set; } 
    public virtual int IDDETAIL { get; set; } 
    public virtual string IDTESTALT { get; set; } 
    public virtual byte[] BLOB { get; set; } 

    public virtual IList<Dettaglio> Details { get; set; } 
} 

này là chi tiết của báo cáo

public class Dettaglio 
{ 
    public virtual int IDDETAIL { get; set; } 
    public virtual int IDTEST { get; set; } 
    public virtual string DSDETAIL { get; set; } 

    public virtual Testata TEST_TABLE { get; set; } 
} 

Và đây là định nghĩa API thông thạo của tôi về cả hai. Trụ sở của báo cáo:

public TEST_TABLEMap() 
    { 
     // Primary Key 
     this.HasKey(t => t.IDTEST) 
      .Property(t => t.IDTEST) 
      .IsRequired() 
      .HasColumnType("Int") 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) 
      .HasColumnName("IDTEST"); 


     // Table & Column Mappings 
     this.ToTable("TEST_TABLE"); 
     this.Property(t => t.Value).HasColumnName("DSVALUETEST"); 
     this.Property(t => t.IDTESTALT).HasColumnName("IDTESTALT"); 
     this.Property(t => t.BLOB).HasColumnName("BLOB"); 
    } 

chi tiết của báo cáo:

public TEST_DETAILMap() 
    { 
     // Primary Key 
     this.HasKey(t => t.DSDETAIL); 

     // Properties 
     this.Property(t => t.DSDETAIL); 

     // Table & Column Mappings 
     this.ToTable("TEST_DETAIL"); 
     this.Property(t => t.IDDETAIL).HasColumnName("IDDETAIL"); 
     // this.Property(t => t.IDTEST).HasColumnName("IDTEST"); 
     this.Property(t => t.DSDETAIL).HasColumnName("DSDETAIL"); 

     // Relationships 
     this.HasOptional(t => t.TEST_TABLE) 
      .WithMany(t => t.Details) 
      .HasForeignKey(d => d.IDDETAIL).WillCascadeOnDelete(true); 

    } 

On thi tôi luôn luôn nhận được lỗi này

System.Data.Entity.Edm.EdmAssociationType:: Đa dạng xung đột với ràng buộc tham chiếu trong Vai trò 'Dettaglio_TEST_TABLE_Target' trong mối quan hệ 'Dettaglio_TEST_TABLE'. Vì tất cả các thuộc tính trong Vai trò phụ thuộc đều không có giá trị, nên tính đa dạng của Vai trò chính phải là '1'.

Mà, tôi đoán, có nghĩa là tôi đang thất bại ở định nghĩa khóa ngoại, nhưng tôi thực sự không biết phải nhìn vào đâu. Bất kỳ trợ giúp/gợi ý nào được đánh giá cao.

Trả lời

89

Có sự mâu thuẫn giữa tài sản nước ngoài chủ chốt của bạn trong lớp Dettaglio ...

public virtual int IDTEST { get; set; } 

... trong đó có một loại không nullable (int) và do đó không thể là tùy chọn và lập bản đồ của bạn ...

this.HasOptional(t => t.TEST_TABLE) //... 

... nơi bạn muốn mối quan hệ là tùy chọn.

Nếu bạn thực sự muốn có một mối quan hệ không bắt buộc sử dụng một tài sản FK nullable:

public virtual int? IDTEST { get; set; } 

Nếu không, bạn phải sử dụng HasRequired cho một mối quan hệ cần thiết với một tài sản FK nullable.

+1

Cảm ơn bạn rất nhiều :) đã giải quyết – user2541621

+1

Đây là câu trả lời hay nhất – abelabbesnabi

+2

'?' là sự bổ sung quan trọng trong trường hợp của tôi. – jonas

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