对于这里的比喻,一个人可以拥有零辆或一辆车,一辆车只属于一个人。
我有一个如下所示的数据库:
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:
Person_Id
tblCar
字段
tblCar
中创建两个外键,一个名为idPerson
,另一个Person_Id
我忘了或做错了什么?
答案 0 :(得分: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 :(得分:1)
我忘了或做错了什么?
您没有正确配置Person
- Car
关系。
让我们解决这个问题。请注意,您不需要在两个位置配置关系。
从Person
配置中删除以下内容:
HasOptional(a => a.Car)
.WithOptionalPrincipal();
并在Car
配置中替换以下内容:
HasRequired(a => a.Person)
.WithRequiredDependent();
与
HasRequired(c => c.Person)
.WithOptional(p => p.Car);