在非关键字段

时间:2015-12-01 13:43:18

标签: c# entity-framework-6

我们将Entity Framework 6与CodeFirst和Oracle.ManagedDataAccess一起使用。

我刚刚创建了两个表之间的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列。

运行此示例时,我收到错误消息:

  

Multiplicity在Role&#39; Point_NodeFk_Target&#39;中无效。在关系&#39; Point_NodeFk&#39;。由于Dependent Role属性不是关键属性,因此Dependent Role的多重性的上限必须为&#39; *&#39;。

所以我猜EntityFramework现在认为它应该是1:N关系。

如何解决这个问题?我无法改变数据库(虽然我非常想)。

1 个答案:

答案 0 :(得分:0)

实体框架需要每个表上的主键。你需要添加一个没有EF会抱怨的主要内容。所以看你的代码Point类需要ID,Id,PointId或PointID属性,所以EF会知道它有一个主键。我在此处作为类属性显示的任何约定都可以被EF接受。