Не удается разрешить символ SaveChangesAsync - PullRequest
1 голос
/ 07 апреля 2019

У меня следующая проблема с .NET Core и Entity Framework.Я создал сам проект .NET Core, добавил DbContext и все остальное.Моя проблема в том, что я могу загрузить данные без малейшей проблемы, к сожалению, я не могу их сохранить, т.е. у меня есть метод Add, но у меня нет метода SaveChanges.

using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

using CRM.Model.Entities;

namespace CRM.Model.Concrete
{
    public abstract class ApplicationContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationContext(DbContextOptions<ApplicationContext> options) : base(options)
        {

        }

        public DbSet<Category> Categories { get; set; }
        public DbSet<Subcategory> Subcategories { get; set; }
        public DbSet<SubcategoryL2> SubcategoriesL2 { get; set; }
        public DbSet<Event> Events { get; set; }
        public DbSet<ApplicationUser> Users { get; set; }
        public DbSet<Coupon> Coupons { get; set; }
        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            builder.Entity<SubcategoryL2>().ToTable("Subs");
            #region "Seed Data"

            builder.Entity<IdentityRole>().HasData(
                new { Id = "1", Name = "Admin", NormalizedName = "ADMIN" },
                new { Id = "2", Name = "User", NormalizedName = "USER" }
            );

            #endregion
        }
    }
}

ICouponRepository

using System.Threading.Tasks;
using CRM.Model.Concrete;

namespace CRM.Repository.Abstract
{
    public interface ICouponRepository
    {
        Task AddCoupon(Coupon coupon);
    }
}

CouponRepository

using System.Threading.Tasks;
using CRM.Model.Concrete;
using CRM.Repository.Abstract;

namespace CRM.Repository.Concrete
{
    public class CouponRepository : ICouponRepository
    {
        private readonly ApplicationContext _applicationContext;

        public CouponRepository(ApplicationContext applicationContext)
        {
            _applicationContext = applicationContext;
        }

        public async Task AddCoupon(Coupon coupon)
        {
           await _applicationContext.Coupons.AddAsync(coupon);
           await _applicationContext.SaveChangesAsync();
        }
    }
}

И проблема здесь в CouponRepository, то есть enter image description here

Я понятия не имею, как яможет исправить это и почему это не работает: (

CS1061 Элемент «ApplicationContext» не содержит определения «SaveChangesAsync», а доступный метод расширения «SaveChangesAsync» не найден, который принимаетпервый аргумент типа «ApplicationContext» (не директива using или ссылка на комплект?).

вторая ошибка

CS0012 C # «IdentityDbContext <>»тип определен в наборе без ссылок. Необходимо добавить ссылку на набор "Microsoft.AspNetCore.Identity.EntityFrameworkCore, версия = 2.2.0.0, культура = нейтральная, PublicKeyToken = adb9793829ddae60"

Мой проект разделен на несколько более мелких, то есть основной проект CRM.В нем есть несколько меньших:

  • CRM.Core
  • CRM.Services
  • CRM.Repository
  • CRM.Resources
  • CRM.Model

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

когда я меняю

открытый абстрактный класс ApplicationContext: IdentityDbContext

на

открытый абстрактный классApplicationContext: DbContext

тогда все в порядке, но тогда идентификация не будет работать для меня

Решение: Решением моей проблемы была установка Microsoft.Пакет AspNetCore.Identity.EntityFrameworkCore через пакет NuGet.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

Прежде всего вам нужно звонить SaveChangesAsync против контекста, а не DbSet, поэтому вы должны написать это:

await _applicationContext.SaveChangesAsync();

Во-вторых, в качестве бонуса, вы не должныиспользовать AddAsync, если вам действительно не нужно, вы должны делать это:

_applicationContext.Coupons.Add(coupon);

документы состояние:

Этот метод только асинхронныйразрешить специальным генераторам значений, таким как тот, который используется Microsoft.EntityFrameworkCore.Metadata.SqlServerValueGenerationStrategy.SequenceHiLo ', для асинхронного доступа к базе данных.Для всех остальных случаев следует использовать не асинхронный метод.

0 голосов
/ 08 апреля 2019

Из второго сообщения об ошибке ясно, что вы должны сделать. Установите Microsoft.AspNetCore.Identity.EntityFrameworkCore пакет nuget в проект, где CouponRepository расположен следующим образом:

PM> Install-Package Microsoft.AspNetCore.Identity.EntityFrameworkCore -Version 2.2.0

Или вы также можете добавить метапакет Microsoft.AspNetCore.App в ваш проект CouponRepository, добавив следующий элемент.

<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

Ошибка должна исчезнуть сейчас!

...