在非键字段上创建一对零或一关系

本文关键字:关系 创建 字段 | 更新日期: 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可以接受的。