C# 如何通过非主键(EF First代码)创建一对一关系

C# 如何通过非主键(EF First代码)创建一对一关系,c#,entity-framework,orm,ef-code-first,one-to-one,C#,Entity Framework,Orm,Ef Code First,One To One,我有两个等级“汽车”和“汽车细节” 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 Ca

我有两个等级“汽车”和“汽车细节”


    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
的CarDetails不超过1个

然而,从技术上讲,这不是一种
11
关系。。。这是一种
10..1
关系。这种类型的模型将允许
Car
对象存在,而不存在任何相应的
CarDetils
对象

如果您想要更接近
11
关系,我认为唯一的方法是使用fluent model builder:

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);
    }
}

参考:

为了与EF建立一对一的关系,两个表必须共享同一个主键。这意味着
CarDetails
应具有与
Car
相同的主键,
CarDetails
的主键列应具有FK。谢谢。你能写出正确的代码吗?(当然可以在数据库中完成。)我想通过“CarGuid”在两个类之间创建关系,但EF不允许我这样做,因为您不能使用
CarGuid
建立1对1关系,除非
CarGuid
是两个类(表)的主键。使用EF是不可能的。
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);
    }
}