Отношения между родителями и детьми в свободном API - PullRequest
2 голосов
/ 21 июня 2011

Хорошо, это становится нелепым, поскольку это оказывается намного сложнее, чем когда-либо.

Если я использую свой исходный код без отображения 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, когда нет родителя.Если нет, то ладно, я разберусь.

1 Ответ

1 голос
/ 21 июня 2011

Нет, нет способа избежать обнуляемого значения ParentId - вы сказали EF, что родительский элемент необязательный (это должно быть иначе, вы не сможете использовать таблицу), и из-за этого связанное свойство FK должно иметь значение NULL.

...