Open Infarh opened 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;
}
Нужно проверить вариант решения
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();
}
Создать действие контроллера, которое будет создавать новую пустую запись "Блога" и отправлять её на редактирование уже существующим методом.