如何在不丢失数据的情况下扩展两个实体之间的关系?

时间:2019-07-19 14:40:01

标签: c# asp.net-core entity-framework-core

我想在不丢失数据的情况下扩展两个实体之间的现有关系。那就是ASP.NET Core 2.0 Web App。

我有CarsNavs(GPS集)。特定的Car可以具有特定的Nav,反之亦然特定的Nav可以位于特定的Car中。但是,Nav可能在仓库中,因此它不在任何汽车中,并且特定的汽车目前不能有任何Nav。当然,特定的Nav可能在1辆汽车中最多,而特定的Car可能具有1 Nav最大值。

我在NavsCars之间建立了联系。我还想在Cars和Nav之间添加关系,以轻松地从当前存在的Nav系统的Car level数据中提取(如果有的话)。

现在我有以下设置:

public class Car
{
    public int ID { get; set; }
    public string ModelName { get; set; }
 //other properties
}
public class Nav
{
    public int ID { get; set; }
    public decimal ScreenSize { get; set; }
 //other properties
    public virtual Car Car { get; set; }
}

我要做的就是添加到Car类中:

public virtual Nav Nav { get; set; }

但是,当我运行Add-Migration时,它会断开当前关系,因此,如果我正确理解,将会丢失到目前为止的所有数据...这就是在AddMigration之后得到的结果:

migrationBuilder.DropForeignKey(
    name: "FK_Navs_Cars_CarID",
    table: "Navs");

migrationBuilder.DropIndex(
    name: "IX_Navs_CarID",
    table: "Navs");

migrationBuilder.DropColumn(
    name: "CarID",
    table: "Navs");

migrationBuilder.AlterColumn<int>(
    name: "ID",
    table: "Navs",
    nullable: false,
    oldClrType: typeof(int))
    .OldAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);

migrationBuilder.AddForeignKey(
    name: "FK_Navs_Cars_ID",
    table: "Navs",
    column: "ID",
    principalTable: "Cars",
    principalColumn: "ID",
    onDelete: ReferentialAction.Cascade);

维护当前关系和数据并从具有可选功能的另一端添加关系的最佳方法是什么?

添加以进行澄清: 通过当前关系,我可以轻松地从Car级别提取关于Nav的数据:

  var modelName = nav.Car != null ? nav.Car.ModelName : "";

我也想通过其他方式做同样的事情:

  var screenSize = car.Nav != null ? car.Nav.ScreenSize : 0;

1 个答案:

答案 0 :(得分:1)

在添加此属性之前,EF实际上是在创建一对多关联。通过添加此属性,就可以使其一对一。对于一对一,EF必须定义一个主体端和从属端(换句话说,哪个获得外键)。如果需要,您可以自定义此功能,但除此之外,EF会自行选择,这里的情况似乎只是它从实际需要中选择了另一端。因此,您只需要添加一些流利的配置即可明确显示您想要的内容:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Car>()
        .HasOne(p => p.Nav)
        .WithOne(p => p.Car)
        .HasForeignKey<Nav>("CarID");
}