EF Основные отношения - PullRequest
0 голосов
/ 21 мая 2018

У меня проблема с построением отношений.

Я хочу, чтобы у каждого Post было одного пользователя и много Comments.Каждый User имеет много Comments и Posts (если я хочу в любое время фильтровать комментарии и сообщения на пользователя).И затем каждый Comment имеет одного пользователя и сообщение

Проблема в том, когда я заполняю базу данных

if (!ctx.Posts.Any()) {
    Tag tag = new Tag() {
        Name = "Test1"
    };

    User user = new User() {
        UserName = "TestUser",
        Email = "test1@test1.bg",
        Password = Extensions.PasswordHash("abv123456", config["AppSettings:PasswordSalt"]),
        Role = UserRoles.Member
    };

    ctx.Users.Add(user);

    Post post = new Post() {
        Title = "Test Post",
        Description = "Description post test",
        Likes = 5,
        User = user,
        CreateOn = DateTime.Now,
        LastEditOn = DateTime.Now
    };

    PostTag posttags = new PostTag() {
        Post = post,
        Tag = tag
    };

    ctx.PostTag.Add(posttags);
    ctx.SaveChanges();
};

И если я хочу получить все сообщения ссвязанный User

public IActionResult GetAllPost() {
    var posts = _ctx.Posts
        .Include(u => u.User)
        .ToList();

    return Json(Newtonsoft.Json.JsonConvert.SerializeObject(posts));
}

Я получаю Newtonsoft.Json.JsonSerializationException: обнаружен цикл самоссылки с типом Blog.Data.Entities.Post.Путь '[0] .User.Posts'.

Хотя в моем методе Configure я игнорировал его

services.AddMvc().AddJsonOptions(opts => {
    opts.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});

OnModelCreating ()

protected override void OnModelCreating(ModelBuilder modelBuilder) {
    // set unique email and username
    modelBuilder.Entity<User>()
        .HasIndex(u => new { u.Email, u.UserName })
        .IsUnique();

    // set unique tag name
    modelBuilder.Entity<Tag>()
        .HasIndex(t => t.Name)
        .IsUnique();

    modelBuilder.Entity<Post>()
        .HasOne(p => p.User)
        .WithMany(u => u.Posts);

    modelBuilder.Entity<User>()
        .HasMany(u => u.Comments)
        .WithOne(u => u.User);

    // post tag many-to-many rel
    modelBuilder.Entity<PostTag>()
        .HasKey(pt => new { pt.PostUID, pt.TagUID });

    modelBuilder.Entity<PostTag>()
        .HasOne(pt => pt.Post)
        .WithMany(p => p.PostTags)
        .HasForeignKey(pt => pt.PostUID);

    modelBuilder.Entity<PostTag>()
        .HasOne(pt => pt.Tag)
        .WithMany(p => p.PostTags)
        .HasForeignKey(pt => pt.TagUID);
} 

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Проблема в том, что вы настроили свой сервис, но не используете сервис.Вы используете статическую ссылку на Newtonsoft Json конвертер.Вам либо нужно использовать сервис, предоставляемый платформой (он должен использовать его автоматически при возврате модели из контроллера), либо применить конфигурацию к вызову конвертера NewtonSoft Json, который вы используете.

0 голосов
/ 21 мая 2018

Вы пытаетесь JSONify JSON-строки:

return Json(Newtonsoft.Json.JsonConvert.SerializeObject(posts));

Вы должны позволить фреймворку сделать это за вас:

return Json(posts);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...