这是存储库模式,通常如果我使用ContextDb而不是IdentityContextDb,它会起作用,但我必须使用Indentity来创建我的Identificial东西。
Core.Repository
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
namespace XYZ.CORE.Repository
{
public class Repository<TEntity, TContext> : IRepository<TEntity> where
TEntity : class, new() where TContext : IdentityDbContext, new()
{
public void Delete(TEntity entity)
{
using (var context=new TContext())
{
var deleteEntity = context.Entry(entity);
deleteEntity.State = EntityState.Deleted;
context.SaveChanges();
}
}
public IEnumerable<TEntity> GetAll(Expression<Func<TEntity, bool>> filter = null)
{
using (var context = new TContext())
{
return filter == null ? context.Set<TEntity>().AsEnumerable() : context.Set<TEntity>().Where(filter).AsEnumerable();
}
}
public TEntity GetById(int id)
{
using (var context = new TContext())
{
return context.Set<TEntity>().Find(id);
}
}
public void Insert(TEntity entity)
{
using (var context = new TContext())
{
var addEntity = context.Entry(entity);
addEntity.State = EntityState.Added;
context.SaveChanges();
}
}
public void Update(TEntity entity)
{
using (var context = new TContext())
{
var updatedEntity = context.Entry(entity);
updatedEntity.State = EntityState.Modified;
context.SaveChanges();
}
}
}
}
再次但:)当我从 IdentityContextDB 继承我的上下文时,它想要像这一行底部这样的泛型类型及其对存储库的问题。
我将分享当我们调用此存储库时的错误
达尔。上下文
using XYZ.DATA.Entity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Text;
namespace XYZ.DAL.Context
{
public class XyzDb:IdentityDbContext<AppUser>
{
public HysWebDb(DbContextOptions options) : base(options)
{
}
}
}
现在让我们调用控制器
用户界面。控制器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using XYZ.UI.Models.VM;
using Microsoft.AspNetCore.Mvc;
using XYZ.DAL.Context;
using Microsoft.AspNetCore.Identity;
using XYZ.DATA.Entity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.AspNetCore.Authorization;
using XYZ.CORE.Repository;
namespace XYZ.UI.Controllers.Account
{
//[Authorize(Roles ="Admin")]
public class RegisterController : Controller
{
private readonly XyzDb _database;
private readonly UserManager<AppUser> _uManager;
private readonly Repository<AppUser,XyzDb> _userRepo;
public RegisterController(UserManager<AppUser> uManager, XyzDb database)
{
_database = database;
_uManager = uManager;
}
}
}
虽然我们还没有注射但是...
错误 CS0311类型"XYZ。达尔。Context.XyzDb' 不能用作泛型类型或方法中的类型参数 'TContext' "存储库"。没有隐式引用 从"XYZ"转换。达尔。Context.XyzDb' to 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext'. ~\XYZ.UI\控制器\帐户\注册控制器.cs21活动
错误 CS0310'XyzDb' 必须是具有公共无参数构造函数的非抽象类型,才能将其用作参数 'TContext' 在泛型类型或方法"存储库"中 ~\XYZ。UI\控制器\帐户\注册控制器.cs21活动
第 21 行在这里私有只读存储库 _userRepo;
谢谢
Özgür
public class Repository<TEntity, TContext> : IRepository<TEntity> where
TEntity : class, new() where TContext : IdentityDbContext, new()
您在这里定义了两件事:
- 存储库类必须在那里使用类 TEntity 和 TContext 有 new(),这意味着无参数构造函数,而实际上你只有 1 个带有选项的构造函数 - (这是你的第二个错误)
public HysWebDb(DbContextOptions options) : base(options)
- 第二个问题不是100%确定,但是如果你继承了一个通用接口,但声明了类型 - IdentityDbContext - 它不能被视为只有IdentityDbContext
public class XyzDb:IdentityDbContext < AppUser>
要解决您的问题,您应该将公共类存储库更改为以下内容:
public class Repository<TEntity, TContext> : IRepository<TEntity> where
TEntity : class, new() where TContext : IdentityDbContext<AppUser>
实际上,您正在对通用存储库类设置约束
public class Repository<TEntity, TContext> : IRepository<TEntity> where
TEntity : class, new() where TContext : IdentityDbContext, new()
它是 IdentityDbContext上的new(),所以你的 IdentityDbContext 应该包含一个无参数构造函数。 有关更多详细信息,请查看微软文档 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/new-constraint
我可以通过在构造函数中使用上下文引用和注入来解决
public class Repository<T> : IRepository<T> where T : class
{
private readonly ContextX _database;
public Repository(ContextX database)
{
_database = database;
}
我们找不到其他解决方案的方法
谢谢
Özgür Deniz