EF6.1.1 代码优先 One-to-Zero/One 关系
EF6.1.1 Code First One-to-Zero/One Relationship
我正在尝试定义这些表。
_tbl1_
id (PK)
_tbl2_
id (PK)
tbl1_id (FK)
_tbl3_
id (PK)
tbl1_id (FK)
...我可以从 Tbl1 导航到 Tbl2 或 Tbl3
或从 Tbl2 或 Tbl3 返回到 Tbl1.
虽然需要从 Tbl2 或 Tbl3 到 Tbl1 的关联,但记录在Tbl2 或 Tbl3 可能不存在;所以 Tbl1 记录应该能够与我们的 Tbl2 和 Tbl3.
这样设计是为了从Tbl1的角度与两个完全不同的实体建立可选关系。
class Tbl1
{
[Key]
public int Id { get; set; }
public Tbl2 Tbl2 { get; set; }
public Tbl2 Tbl3 { get; set; }
}
class Tbl2
{
[Key]
public int Id { get; set; }
[ForeignKey("Tbl1")]
public int Tbl1Id { get; set; }
public Tbl1 Tbl1 { get; set; }
}
class Tbl3
{
[Key]
public int Id { get; set; }
[ForeignKey("Tbl1")]
public int Tbl1Id { get; set; }
public Tbl1 Tbl1 { get; set; }
}
并且流利...
modelBuilder.Entity<Tbl2>()
.HasRequired(e => e.Tbl1)
.WithOptional(e => e.Tbl2);
modelBuilder.Entity<Tbl3>()
.HasRequired(e => e.Tbl1)
.WithOptional(e => e.Tbl3);
使用上面的方法我得到一个错误:
Dependent Role properties are not the key properties, the upper bound
of the multiplicity of the Dependent Role must be '*'.
这似乎意味着外键也必须是记录键。
那么,我可以这样做吗?可以吗?
我很乐意使用属性或流利 api 或两者兼而有之。
我认为您的 ForeignKey
属性需要引用一列并放置在导航上方 属性。例如:
[ForeignKey("Tbl1Id")]
public virtual Tbl1 tbl1 {get; set;}
即使您在 Tbl1 上定义导航 属性 到 Tbl2 和 Tbl3,外键注释也应该在从属 classes(tbl2 和 tbl3)中定义,而不是主体 class.
我不确定这是否能解决整个问题,但也许会有帮助。
祝你好运
就像其他类似问题一样;一对一或零可以通过对实体键使用相同的 属性 和从属实体上的主体实体的外键来实现。
我看不出另一种方式,并且由于在 SQL 中创建一对一或零将要求外键具有唯一性约束,因此最终结果几乎相同。
- Entity Framework One-To-One Mapping Issues
- 配置一对一
关系
- Configuring Relationships with the Fluent API
- One to zero/one relation in entity framework code first
我正在尝试定义这些表。
_tbl1_
id (PK)
_tbl2_
id (PK)
tbl1_id (FK)
_tbl3_
id (PK)
tbl1_id (FK)
...我可以从 Tbl1 导航到 Tbl2 或 Tbl3
或从 Tbl2 或 Tbl3 返回到 Tbl1.
虽然需要从 Tbl2 或 Tbl3 到 Tbl1 的关联,但记录在Tbl2 或 Tbl3 可能不存在;所以 Tbl1 记录应该能够与我们的 Tbl2 和 Tbl3.
这样设计是为了从Tbl1的角度与两个完全不同的实体建立可选关系。
class Tbl1
{
[Key]
public int Id { get; set; }
public Tbl2 Tbl2 { get; set; }
public Tbl2 Tbl3 { get; set; }
}
class Tbl2
{
[Key]
public int Id { get; set; }
[ForeignKey("Tbl1")]
public int Tbl1Id { get; set; }
public Tbl1 Tbl1 { get; set; }
}
class Tbl3
{
[Key]
public int Id { get; set; }
[ForeignKey("Tbl1")]
public int Tbl1Id { get; set; }
public Tbl1 Tbl1 { get; set; }
}
并且流利...
modelBuilder.Entity<Tbl2>()
.HasRequired(e => e.Tbl1)
.WithOptional(e => e.Tbl2);
modelBuilder.Entity<Tbl3>()
.HasRequired(e => e.Tbl1)
.WithOptional(e => e.Tbl3);
使用上面的方法我得到一个错误:
Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be '*'.
这似乎意味着外键也必须是记录键。
那么,我可以这样做吗?可以吗?
我很乐意使用属性或流利 api 或两者兼而有之。
我认为您的 ForeignKey
属性需要引用一列并放置在导航上方 属性。例如:
[ForeignKey("Tbl1Id")]
public virtual Tbl1 tbl1 {get; set;}
即使您在 Tbl1 上定义导航 属性 到 Tbl2 和 Tbl3,外键注释也应该在从属 classes(tbl2 和 tbl3)中定义,而不是主体 class.
我不确定这是否能解决整个问题,但也许会有帮助。
祝你好运
就像其他类似问题一样;一对一或零可以通过对实体键使用相同的 属性 和从属实体上的主体实体的外键来实现。
我看不出另一种方式,并且由于在 SQL 中创建一对一或零将要求外键具有唯一性约束,因此最终结果几乎相同。
- Entity Framework One-To-One Mapping Issues
- 配置一对一 关系
- Configuring Relationships with the Fluent API
- One to zero/one relation in entity framework code first