以一对一或一对一关系复制键和表字段

时间:2016-03-04 19:51:02

标签: c# database entity-framework entity-framework-6

对于这里的比喻,一个人可以拥有零辆或一辆车,一辆车只属于一个人。

我有一个如下所示的数据库:

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

我忘了或做错了什么?

2 个答案:

答案 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);