无法解析符号SaveChangesAsync

时间:2019-04-07 16:30:22

标签: c# .net-core entity-framework-core

.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。存储库
  • CRM。资源
  • CRM.Model

问题在于,没有丝毫问题,我使用ApplicationContext从数据库中检索数据,不幸的是,我无法保存任何数据,因为错误如图片中那样弹出。

当我改变

  

公共抽象类ApplicationContext:   IdentityDbContext

  

公共抽象类ApplicationContext:DbContext

那一切都很好,但是身份对我不起作用

解决方案: 解决我的问题的方法是通过NuGet软件包安装Microsoft.AspNetCore.Identity.EntityFrameworkCore软件包。

2 个答案:

答案 0 :(得分:2)

首先,您需要针对上下文而不是SaveChangesAsync来调用DbSet,因此您应该这样写:

await _applicationContext.SaveChangesAsync();

第二,作为奖励,除非您确实需要使用AddAsync,否则您应该这样做:

_applicationContext.Coupons.Add(coupon);

docs状态:

  

此方法是异步的,仅允许特殊值生成器(例如“ Microsoft.EntityFrameworkCore.Metadata.SqlServerValueGenerationStrategy.SequenceHiLo”使用的生成器)异步访问数据库。对于所有其他情况,应使用非异步方法。

答案 1 :(得分:0)

从第二条错误消息中可以清楚地知道您必须做什么。将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>

错误现在应该消失了!