实体框架首先使用代码的1对1关系.怎么样?

Hea*_*ath 30 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 string Name { get; set; }

  public virtual Region _region { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试这个时,我得到这个错误:Multiplicity在关系'Region_Factory'中的Role'Region_Factory_Source'中无效.由于"从属角色"属性不是关键属性,因此从属角色的多重性的上限必须为"*".

Cla*_*ies 39

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

您可以使用两种方法来纠正这种情况.

  1. 从导航属性的一侧或两侧删除虚拟选项,允许0..1或1..1映射.
  2. 在每个对象上为其他实体显式添加外键的属性.即在类Region中添加属性FactoryIdFactory添加属性RegionId

还有其他方法可以帮助实体框架确定哪个对象是从属对象,即使用Entity Framework Fluent api.

来自MSDN

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

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

以下代码将创建Factory具有Dependent 的PrincipalRegion

// 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);
Run Code Online (Sandbox Code Playgroud)

  • 我怀疑时间已经过去并且部分答案无效(当然,不是你的错,呵呵).至于EF6(可能还有EF5,不确定),人们不能再这样做了.我刚刚为我的一个学生测试了这一点(两者都有明确的外键属性,当时在每个属性上都删除了虚拟属性).但是没有饼干......我猜FluidApi是唯一的方法,除非有人质疑1:1关系的有效性(考虑将两个实体放在同一个表中).你怎么看?你可以确认/贬低我的评论吗? (2认同)

小智 5

EF6,添加属性:

[Key]
public int RegionId { get; set; }

[Key, ForeignKey("Region")]
public int FactoryId { get; set; }
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案不会创建一个复合键吗? (3认同)