Entity framework 首先使用代码的实体框架1对1关系。怎样?

Entity framework 首先使用代码的实体框架1对1关系。怎样?,entity-framework,Entity Framework,我有两节课。如何使用实体框架代码优先方法将这两个类转换为一对一关系 public class Region { public int RegionId { get; set; } public string Name { get; set; } public virtual Factory _factory { get; set; } } public class Factory { public int FactoryId { get; set; } public st

我有两节课。如何使用实体框架代码优先方法将这两个类转换为一对一关系

public class Region
{
  public int RegionId { get; set; }
  public string Name { get; set; }

  public virtual Factory _factory { get; set; }
}

public class Factory
{
  public int FactoryId { get; set; }
  public string Name { get; set; }

  public virtual Region _region { get; set; }
}
当我尝试此操作时,会出现以下错误:
多重性在关系“Region\u Factory”中的角色“Region\u Factory\u Source”中无效。由于从属角色属性不是键属性,因此从属角色的多重性上限必须为“*”。

这在CodeFirst中发生,因为虚拟关键字。实际上,您正在创建一种关系,其中创建一项需要创建另一项。但是,virtual关键字允许延迟实例化,这意味着创建一个类型的对象不会自动创建另一个类型,从而允许外部项上的Id为null。这意味着一个0..1关系,但由于每一方都是虚拟的,所以得到的是一个0..0,这是不允许的

有两种方法可以用来补救这种情况

  • 从导航属性的一侧或两侧删除虚拟选项,允许使用0..1或1..1地图
  • 在每个对象上为来自其他实体的外键显式添加属性。i、 e.在class
    Region
    上为
    FactoryId
    添加属性,在
    Factory
    上为
    RegionId
  • 还有其他方法可以帮助实体框架确定哪个对象是依赖对象,即使用实体框架Fluent api

    配置需要两端的关系(一对一)

    在大多数情况下,实体框架可以推断关系中的依赖类型和主体类型。但是,当关系的两端都是必需的或双方都是可选的时,实体框架无法识别从属关系和主体关系。如果关系的两端都是必需的,请在HasRequired方法之后使用WithRequiredPrincipal或WithRequiredDependent。如果关系的两端都是可选的,请在HasOptional方法之后使用WithOptionalPrincipal或WithOptionalDependent

    以下代码将创建一个主体
    工厂
    ,其中包含一个从属
    区域

    // Configure the primary key for the Region
    modelBuilder.Entity<Region>()
        .HasKey(t => t.RegionId);
    
    modelBuilder.Entity<Factory>()
        .HasRequired(t => t.Region)
        .WithRequiredPrincipal(t => t.Factory);
    
    //为区域配置主键
    modelBuilder.Entity()
    .HasKey(t=>t.RegionId);
    modelBuilder.Entity()
    .HasRequired(t=>t.Region)
    .具有所需的委托人(t=>t.Factory);
    
    EF6,添加属性:

    [Key]
    public int RegionId { get; set; }
    
    [Key, ForeignKey("Region")]
    public int FactoryId { get; set; }
    

    令人困惑的是,根据这个链接,虚拟关键词应该对关系没有影响。那个MSDN摘录很有帮助!我怀疑时间已经流逝,部分答案无效(当然不是你的错,呵呵)。到了EF6(也可能是EF5,对此不确定),人们就不能再这样做了。我刚刚对我的一个学生进行了测试(两个都有显式外键属性,每次都在两个上删除虚拟属性)。但是没有饼干。。。我想FluidApi是唯一的方法,除非有人质疑1:1关系的有效性(考虑将两个实体放在同一个表中)。你怎么认为?你能确认/记录我的评论吗?这个解决方案不会创建一个复合密钥吗?