OpenGeekBrains / Thoughts

MIT License
0 stars 14 forks source link

По аналогии создать кнопку для создания новой записи #87

Open Infarh opened 2 years ago

Infarh commented 2 years ago

Создать действие контроллера, которое будет создавать новую пустую запись "Блога" и отправлять её на редактирование уже существующим методом.

danatoz commented 2 years ago

Столкнулся с проблемой создания записи. Ef не позволяет сохранять отслеживаемую в контексте запись. Получаю ex. в методе создания поста

InvalidOperationException: The instance of entity type 'Category' cannot be tracked because 
another instance with the same key value for {'Id'} is already being tracked.

    public async Task<Post> CreatePostAsync(
        string Title,
        string Body,
        string UserId,
        string Category,
        CancellationToken Cancel = default)
    {
        if (Title == null || Body == null || UserId == null || Category == null) throw new InvalidOperationException();

        var db_category = await _DB.Categories.FirstOrDefaultAsync(c => c.Name == Category, Cancel).ConfigureAwait(false);

        if (db_category is null) db_category = new DAL.Entities.Category { Name = Category };

        var post = new Post
        {
            Title = Title,
            Body = Body,
            Category = db_category.CategoryToDomain()!,
            User = _DB.Users.FirstOrDefault(user => user.Id == UserId).UserToDomain()!,
        };

        await _DB.Posts.AddAsync(post.PostToDAL()!, Cancel).ConfigureAwait(false);
        await _DB.SaveChangesAsync(Cancel).ConfigureAwait(false);

        return post;
    }
Infarh commented 2 years ago

Нужно проверить вариант решения

public async Task<Post> CreatePostAsync(
    string Title,
    string Body,
    string UserId,
    string Category,
    CancellationToken Cancel = default)
{
    if (Title == null || Body == null || UserId == null || Category == null) throw new InvalidOperationException();

    var db_category = await _DB.Categories.FirstOrDefaultAsync(c => c.Name == Category, Cancel).ConfigureAwait(false)
        ?? new (){ Name = Category };

    var post = new DAL.Entities.Post
    {
        Title = Title,
        Body = Body,
        Category = db_category,
        User = await _DB.Users.FindAsync(UserId)
    };

    _DB.Add(post);
    await _DB.SaveChangesAsync(Cancel).ConfigureAwait(false);

    return post.PostToDomain();
}