Как мне обойти эту циклическую ссылку в EF? - PullRequest
0 голосов
/ 26 июля 2011

Я использую Entity Framework Code First с SQLCE в MVC3 для блогового сайта.Я открыт для изменения структуры, если потребуется, было бы здорово получить некоторую помощь.

Контекст настроен как:

public class BinarContext : DbContext
{
    public DbSet<Member> Members { get; set; }
    public DbSet<Post> Posts { get; set; }
    public DbSet<Reply> Replies { get; set; }

    public BinarContext()
    {
        this.Configuration.LazyLoadingEnabled = true;
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Member>().HasMany(member => member.Posts)
                                     .WithRequired(post => post.Member)
                                     .HasForeignKey(post => post.MemberID)
                                     .WillCascadeOnDelete();

        modelBuilder.Entity<Member>().HasMany(member => member.Replies)
                                     .WithRequired(reply => reply.Member)
                                     .HasForeignKey(reply => reply.MemberID)
                                     .WillCascadeOnDelete();

        modelBuilder.Entity<Post>().HasMany(post => post.Replies)
                                   .WithRequired(reply => reply.Post)
                                   .HasForeignKey(reply => reply.PostID)
                                   .WillCascadeOnDelete();

        base.OnModelCreating(modelBuilder);
    }
}

* Примечание: * Я пытался избавиться от WillCascadeOnDelete();, как предлагали другие пользователи SO, но пока не получалось.

Модели:

В классе Member есть информация о сообщениях и ответах.сделано участником.

public class Member
{
    public Guid ID {get; set;}
    public string Username { get; set; }
    public string Email { get; set; }

    public virtual ICollection<Post> Posts { get; set; }
    public virtual ICollection<Reply> Replies { get; set; }
}

Класс Post, в котором есть информация о члене, который его опубликовал, и о опубликованном ответе для него.

public class Post
{
    public Guid ID {get; set;}
    [DataType(DataType.MultilineText)]
    public string Text { get; set; }
    public Guid MemberID { get; set; }

    public virtual Member Member { get; set; }
    public virtual ICollection<Reply> Replies { get; set; }
}

Класс Reply, в котором содержится информация оучастник, который опубликовал это сообщение и за сообщение, которое он опубликовал.

public class Reply    
{
    public Guid ID { get; set; }
    [DataType(DataType.MultilineText)]
    public string Text { get; set; }

    public Guid PostID { get; set; }
    public Guid MemberID { get; set; }

    public virtual Post Post { get; set; }
    public virtual Member Member { get; set; }
}

Спасибо за вашу помощь:)

1 Ответ

1 голос
/ 19 августа 2011

Попробуйте это:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Member>().HasKey(x=>x.ID)
                                     .HasMany(x => x.Posts)
                                     .WillCascadeOnDelete();

        modelBuilder.Entity<Member>().HasKey(x=>x.ID)
                                     .HasMany(x => x.Replies)
                                     .WillCascadeOnDelete();

        modelBuilder.Entity<Post>().HasKey(x=>x.ID)
                                   .HasMany(x => x.Replies)
                                   .WillCascadeOnDelete();

        modelBuilder.Entity<Post>().HasKey(x=>x.ID)
                                   .WithRequired(x => x.Member)
                                   .WithMany(x=>x.Posts);

        modelBuilder.Entity<Replies>().HasKey(x=>x.ID)
                                   .WithRequired(x => x.Member)
                                   .WithMany(x=>x.Replies);

        modelBuilder.Entity<Replies>().HasKey(x=>x.ID)
                                   .WithRequired(x => x.Post)
                                   .WithMany(x=>x.Replies);

        base.OnModelCreating(modelBuilder);
    }
...