Entity Framework: Model содержат список (навигационные свойства) трех элементов типа = самой, что дает ошибку. (Может быть ошибка отображения внешнего ключа) - PullRequest
2 голосов
/ 11 августа 2011

Моя модель выглядит так

public class User
{
    public int ID { get; set; }

    public string Name { get; set; }


    /*Users who are following current user*/
    public virtual ICollection<User> Followers { get; set; }

    /*Users whom current user is following*/
    public virtual ICollection<User> Following { get; set; }


    /*current user has ignored these users*/
    public virtual ICollection<User> Ignores { get; set; }

}

Для добавления данных

        User john = new User { Name = "john" };
        User mary = new User { Name = "mary" };
        User david = new User { Name = "david" };

        john.Following = new List<User> { mary };
        mary.Followers = new List<User> { john};
        john.Ignores = new List<User> { david};

        context.Users.Add(john);
        context.Users.Add(mary);
        context.Users.Add(david);

        context.SaveChanges();

При этом выдается ошибка:

Невозможно определить действительный порядок для зависимых операций. Зависимости могут существовать из-за ограничений внешнего ключа, требований модели или сгенерированных в хранилище значений.

Если я удаляю свойство Ignores из User Модель работает идеально, а с игнорированием - нет.

Я думаю, что нужно сделать какое-то отображение, пожалуйста, предложите мне, как я могу это сделать !!

1 Ответ

3 голосов
/ 11 августа 2011

Похоже, проблема в том, что EF не знает, какие из двух являются многими ко многим, а какие - один ко многим. Вы можете попытаться явно указать это, а не полагаться на соглашение. Попробуйте переопределить метод OnModelCreating(DbModelBuilder) класса DbContext (если вы используете DbContext).

protected override void OnModelCreating(DbModelBuilder mb)
{
    mb.Entity<User>()
        .HasMany(u => u.Ignores)
        .WithReequired()
        .HasForeignKey(u => u.ID);

    mb.Entity<User>()
        .HasMany(u => u.Followers)
        .WithMany(u => u.Following);
        // If you want to specify a table, use the following line:
        // .Map(m => m.ToTable("CustomManyToManyTableName");
}

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

...