Хорошо, это становится нелепым, поскольку это оказывается намного сложнее, чем когда-либо.
Если я использую свой исходный код без отображения 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: невозможно определить действительный порядок для зависимых операций.Зависимости могут существовать из-за ограничений внешнего ключа, требований модели или сгенерированных хранилищем значений.
Обновление
Использование кода Fluent API из моего кода первой попытки выше (.HasForeignKey) и путемParentID nullable (public long? ParentID), я получил базу данных для успешного сопоставления.Есть ли способ сделать это, не делая FK обнуляемым?Я хотел бы, чтобы ключ был 0, когда нет родителя.Если нет, то ладно, я разберусь.