好吧,这太荒谬了,因为事实证明这比任何权利要困难得多。
如果我使用没有FluentAPI映射的原始代码,我有一个未使用的ParentID字段,并且使用了一个名为Node_ID的新字段。
public class Node {
public long ID { get; private set; }
public long ParentID { get; set; }
public ICollection<Node> Children { get; set; }
}
以下是我的各种尝试:
protected override void OnModelCreating(DbModelBuilder mb)
{
mb.Entity<Node>()
.HasMany<Node>(h => h.Children)
.WithOptional()
.HasForeignKey(h => h.ParentID);
}
DbUpdateException:无法确定相关操作的有效排序。由于外键约束,模型要求或存储生成的值,可能存在依赖关系。
protected override void OnModelCreating(DbModelBuilder mb)
{
mb.Entity<Node>()
.HasMany<Node>(h => h.Children)
.WithOptional()
.Map(m => m.MapKey("ParentID"));
}
MetadataException:指定的架构无效。错误: (82,6):错误0019:类型中的每个属性名称必须是唯一的。已定义属性名称“ParentID”。
[ForeignKey("ParentID")]
public ICollection<Node> Children { get; set; }
protected override void OnModelCreating(DbModelBuilder mb)
{
mb.Entity<Node>()
.HasMany<Node>(h => h.Children)
.WithOptional()
}
DbUpdateException:无法确定相关操作的有效排序。由于外键约束,模型要求或存储生成的值,可能存在依赖关系。
使用上面第一个尝试代码(.HasForeignKey)中的Fluent API代码,并使ParentID可以为空(public long?ParentID),我已经让数据库成功映射。有没有办法在不使FK可以为空的情况下做到这一点?如果没有父级,我希望密钥为0。如果没有,哦,我会处理。
答案 0 :(得分:1)
没有办法避免可以为空ParentId
- 你告诉EF父是可选的(否则你将无法使用该表)并且因为相关的FK属性必须是可空的。