【问题标题】:Entity Framework 1 to 1 relationship using code first. how?Entity Framework 1 对 1 关系首先使用代码。如何?
【发布时间】:2013-09-14 12:28:44
【问题描述】:

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

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_Factory”中的角色“Region_Factory_Source”中无效。因为从属角色属性不是关键属性,所以从属角色的多重性的上限必须是'*'。

【问题讨论】:

标签: entity-framework


【解决方案1】:

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

您可以使用 2 种方法来解决这种情况。

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

还有其他方法可以帮助 Entity Framework 确定哪个对象是依赖对象,即使用 Entity Framework Fluent api。

来自MSDN

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

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

以下代码将创建一个 Principal Factory 和一个 Dependent Region

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

【讨论】:

  • 混淆,虚拟关键字,根据这个链接stackoverflow.com/questions/5597760/…应该对关系没有影响。
  • 那个 MSDN 摘录有帮助!
  • 我怀疑时间已经过去了,部分答案无效(当然不是你的错,呵呵)。从 EF6 开始(可能还有 EF5,对此不确定),不能再这样做了。我刚刚为我的一个学生测试了这一点(两者都显式的外键属性,同时在每个和两个上都删除了虚拟属性)。没有 cookie,但是……我猜 FluidApi 是唯一的方法,除非有人质疑 1:1 关系的有效性(考虑将两个实体放在同一个表中)。你怎么看?请您确认/评论我的评论吗?
【解决方案2】:

EF6,添加属性:

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

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

【讨论】:

  • 此解决方案不会创建复合键吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
相关资源
最近更新 更多