2016-03-04 48 views
0

對於這裏的比喻,一個人可以有零個或一個車,而一個車只屬於一個人。一對一或一對一關係中的重複鍵和表字段

我有一個看起來像這樣的數據庫:

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual Car Car { get; set; } 
} 

public class Car 
{ 
    public int PersonId { get; set; } 
    public virtual Person Person { get; set; } 

    public string Model { get; set; } 
} 

我想有從人鏈接到它的轎車,如果存在的話,並從汽車到它的人。所以我EntityTypeConfigurations是像這樣:

public class PersonConfig : EntityTypeConfiguration<Person> 
{ 
    public PersonConfig() 
    { 
     ToTable("tblPerson"); 

     HasKey(s => s.Id) 
      .Property(s => s.Id) 
      .HasColumnName("idPerson"); 

     Property(s => s.Name) 
      .HasColumnName("strName") 
      .IsRequired(); 

     HasOptional(a => a.Car) 
      .WithOptionalPrincipal(); 
    } 
} 

public class CarConfig : EntityTypeConfiguration<Car> 
{ 
    public CarConfig() 
    { 
     ToTable("tblCar"); 

     HasKey(s => s.PersonId) 
      .Property(s => s.PersonId) 
      .HasColumnName("idPerson"); 

     Property(s => s.Model) 
      .HasColumnName("strModel") 
      .IsRequired(); 

     HasRequired(a => a.Person) 
      .WithRequiredDependent(); 
    } 
} 

我不知道我得到錯誤的,但EF:

  • tblCar
  • 創建一個額外Person_Id場創建兩個外鍵中tblCar,一個名爲idPerson和其他Person_Id

什麼我忘了,或做wron G?

回答

1

您必須使用WithRequired而不是WithOptionalPrincipal,並且不需要在雙方都配置該關係。

public class PersonConfig : EntityTypeConfiguration<Person> 
{ 
    public TaskConfig() 
    { 
     ToTable("tblPerson"); 

     HasKey(s => s.Id); 

     Property(s => s.Id) 
      .HasColumnName("idPerson"); 

     Property(s => s.Name) 
      .HasColumnName("strName") 
      .IsRequired(); 

     HasOptional(a => a.Car) 
      .WithRequired(s => s.Person); 
    } 
} 

public class CarConfig : EntityTypeConfiguration<Car> 
{ 
    public CarConfig() 
    { 
     ToTable("tblCar"); 

     HasKey(s => s.PersonId) 
      .Property(s => s.PersonId) 
      .HasColumnName("idPerson"); 

     Property(s => s.Model) 
      .HasColumnName("strModel") 
      .IsRequired(); 

     //not necessary 
     //HasRequired(a => a.Person) 
      //.WithRequiredDependent(); 
    } 
} 
1

什麼我忘記了或者做錯了嗎?

您沒有正確配置Person-Car關係。

讓我們解決這個問題。請注意,您不需要在兩個地方配置關係。

取下Person配置如下:

HasOptional(a => a.Car) 
     .WithOptionalPrincipal(); 

和替換Car配置如下:

HasRequired(a => a.Person) 
     .WithRequiredDependent(); 

HasRequired(c => c.Person) 
     .WithOptional(p => p.Car);