如何通过非主键创建一对一关系(EF 第一个代码)



>我有两个类'Car'和'CarDetails'


    public class Car {
        public int Id { get; set; }
        public Guid CarGuid { get; set; }
        public string Name { get; set; }
        public virtual CarDetails CarDetails { get; set; }
    }
    public class CarDetails {
        public int Id { get; set; }
        public Guid CarGuid { get; set; }
        public string Color { get; set; }
        public int Weight { get; set; }
        [ForeignKey("CarGuid")]
        public virtual Car Car { get; set; }
    }
 

现在,我想通过"CarGuid"在两个类之间创建关系,但 EF 不允许我这样做,请帮助我!

不能使用非主键属性/列在两个 EF 实体/SQL 表之间创建一对一(或一对零或一)关系。必须使用主键列才能实现与 EF 的这种关系。

public class Car
{
    public int Id { get; set; }
    public Guid CarGuid { get; set; }
    public string Name { get; set; }
    public virtual CarDetails CarDetails { get; set; }
}
public class CarDetails
{
    [Key, ForeignKey("Car")]
    public int Id { get; set; }
    public Guid CarGuid { get; set; }
    public string Color { get; set; }
    public int Weight { get; set; }
    public virtual Car Car { get; set; }
}

通过上述关系,您最终将Car作为主体,CarDetails作为依赖者。通过让CarDetails.Id既是CarDetails的主键又是引用Car.Id的外键,可以确保每个Car不超过 1 个CarDetails

但是,从技术上讲,这不是一种1<->1关系......这是一种1<->0..1关系。这种类型的模型将允许Car对象存在,而无需任何相应的CarDetils对象。

如果你想要更接近1<->1关系的东西,我相信唯一的方法是使用流畅的模型构建器:

public class CarsDbContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Car>();
        modelBuilder.Entity<CarDetails>()
            .HasRequired(x => x.Car).WithRequiredDependent(x => x.CarDetails)
        ;
        base.OnModelCreating(modelBuilder);
    }
}

使用上述定义,除非在同一 SaveChanges 操作中同时保存相应的CarDetails,否则无法保存Car。这与实体框架将带您1<->1一样接近。你可以以类似的方式从关系的另一边实现同样的事情:

public class CarsDbContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Car>()
            .HasRequired(x => x.CarDetails).WithRequiredPrincipal(x => x.Car)
        ;
        modelBuilder.Entity<CarDetails>();
        base.OnModelCreating(modelBuilder);
    }
}

参考: http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx

最新更新