.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();
}
}
}
我不知道如何解决它以及为什么它不起作用:(
CS1061“ ApplicationContext”元素不包含 定义“ SaveChangesAsync”和可用的“ SaveChangesAsync” 找不到扩展方法,该方法采用的第一个参数 “ ApplicationContext”类型(不使用using指令或工具包 参考?)。
第二个错误
CS0012 C#“ IdentityDbContext <>”类型在 未引用集。您必须添加对集合的引用 “ Microsoft.AspNetCore.Identity.EntityFrameworkCore,版本= 2.2.0.0, 文化=中性,PublicKeyToken = adb9793829ddae60“
我的项目分为几个较小的项目,即CRM的主要项目。其中有几个较小的:
问题在于,没有丝毫问题,我使用ApplicationContext从数据库中检索数据,不幸的是,我无法保存任何数据,因为错误如图片中那样弹出。
当我改变
公共抽象类ApplicationContext: IdentityDbContext
到
公共抽象类ApplicationContext:DbContext
那一切都很好,但是身份对我不起作用
解决方案: 解决我的问题的方法是通过NuGet软件包安装Microsoft.AspNetCore.Identity.EntityFrameworkCore软件包。
答案 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>
错误现在应该消失了!