我们将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关系。
如何解决这个问题?我无法改变数据库(虽然我非常想)。
答案 0 :(得分:0)
实体框架需要每个表上的主键。你需要添加一个没有EF会抱怨的主要内容。所以看你的代码Point类需要ID,Id,PointId或PointID属性,所以EF会知道它有一个主键。我在此处作为类属性显示的任何约定都可以被EF接受。