在非键字段上创建一对零或一关系
本文关键字:关系 创建 字段 | 更新日期: 2023-09-27 18:25:21
我们使用带有CodeFirst和Oracle.ManagedDataAccess.的Entity Framework 6
我刚刚在两个表之间创建了一个1到0..1(1到0或1)的关系,它就像一个符咒。但在添加第二个关系时,我遇到了麻烦,因为原始主键列被降级为一个数据列,并添加了一个代理(序列)主键列。外键约束仍在旧字段上。
代码:
public class Node
{
[Key, Column("ID"), Required]
public int Id { get; set; }
[Column("POINT_CODE"), Required, StringLength(10)]
public string PointCode { get; set; }
// ...columns left out...
[ForeignKey("PointCode"), Required]
public NetworkPoint PointCodeFk { get; set; }
}
public class Point
{
[Key, Column("POINT_CODE"), Required, StringLength(10)]
public string PointCode { get; set; }
// ...columns left out...
[ForeignKey("PointCode")]
public Node NodeFk { get; set; }
}
public class MyDbContext : EntityContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Point>()
.HasOptional(m => m.NodeFk)
.WithRequired(o => o.PointCodeFk);
}
// ...stuff left out...
}
与工作示例的不同之处在于,属性Node.PointCode
具有属性Key
,并且没有Node.Id
列。
当运行这个例子时,我得到错误消息:
多重性在关系"Point_NodeFk"中的角色"Point_NodelFk_Target"中无效。由于Dependent Role属性不是键属性,因此Dependent角色的多重性的上限必须为"*"。
所以我想EntityFramework现在认为它应该是一个1:N关系。
如何解决这个问题?我无法更改数据库(尽管我很想更改)。
Entity Framework要求每个表上都有一个主键。你需要增加一个EF会抱怨的初选。因此,查看您的代码Point类需要ID、ID、PointId或PointId属性,这样EF就会知道它有一个主键。我在这里展示的作为类属性的任何约定都是EF可以接受的。