IdentityUser 通用存储库,当我们在 MVC Core 中创建控制器时 Asp.Net



这是存储库模式,通常如果我使用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()

您在这里定义了两件事:

  1. 存储库类必须在那里使用类 TEntity 和 TContext 有 new(),这意味着无参数构造函数,而实际上你只有 1 个带有选项的构造函数 - (这是你的第二个错误)

public HysWebDb(DbContextOptions options) : base(options)

  1. 第二个问题不是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

相关内容

  • 没有找到相关文章

最新更新