Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP MVC将ApplicationUser添加到通用存储库_C#_Asp.net Mvc_Entity Framework_Asp.net Identity - Fatal编程技术网

C# ASP MVC将ApplicationUser添加到通用存储库

C# ASP MVC将ApplicationUser添加到通用存储库,c#,asp.net-mvc,entity-framework,asp.net-identity,C#,Asp.net Mvc,Entity Framework,Asp.net Identity,几天前,我决定在我的项目中使用工作单元&通用存储库。在做了一点搜索之后 在这种模式中,我们有4层: 1. UI 2. Model 3. Repository 4. Service 重点是从模型层中的实体类继承所有域模型。例如: public class Project : Entity<int> { ... } 现在,当我想将ApplicationUser类添加到UoF模式时,我得到了一个错误,即ApplicationUser不是从BaseEntity继承的 提示:Applic

几天前,我决定在我的项目中使用工作单元&通用存储库。在做了一点搜索之后

在这种模式中,我们有4层:

1. UI
2. Model
3. Repository
4. Service
重点是从模型层中的
实体
类继承所有域模型。例如:

public class Project : Entity<int> {
 ...
}
现在,当我想将
ApplicationUser
类添加到UoF模式时,我得到了一个错误,即
ApplicationUser
不是从
BaseEntity
继承的

提示:
ApplicationUser
是从
IdentityUser
类继承的

ApplicationUser
添加到我的设计模式中的最佳实践是什么

更新

我在
iaapplicationuserservice
界面中得到错误消息

public interface IApplicationUserService : IEntityService<ApplicationUser>
{
    Task<Part> GetById(int? id);
}
公共接口IAApplicationUserService:IEntityService
{
任务GetById(int?id);
}
IEntityService

public interface IEntityService<T> : IService
where T : BaseEntity
{
    void Create(T entity);
    void Delete(T entity);
    Task<List<T>> GetAllAsync();
    IEnumerable<T> GetAll();
    Task Update(T entity);
}
公共接口IEntityService:iSeries设备
其中T:BaseEntity
{
无效创建(T实体);
无效删除(T实体);
任务GetAllAsync();
IEnumerable GetAll();
任务更新(T实体);
}
接口
IEntityService
有一个约束,因此作为
T
提供的每个类型都需要从
BaseEntity
派生。由于您的
ApplicationUser
类是从
IdentityUser
派生的,因此它无法满足约束

您可以通过两种方式解决此问题:

  • 为您的用户创建一个类,该类是真实实体,因此是从
    BaseEntity
    entity
    派生的。这样,就不会违反合同。该类可以命名为
    applicationSerentity
    或类似的名称。如果需要存储应用程序用户,则需要将
    ApplicationUser
    的属性映射到
    applicationserentity
    。您还可以考虑是否确实需要从
    IdentityUser
    派生
    ApplicationUser
    类,并从
    BaseEntity
    派生它,而不是创建一个新类
  • 作为替代方案,您可以创建每个实体都需要实现的接口。如果您的示例显示了完整的
    BaseEntity
    类,那么它没有任何成员。因此,您可以轻松地用接口(例如,
    IEntity
    )替换
    BaseEntity
    。无论当前在哪里使用
    BaseEntity
    ,都可以使用此接口,尤其是在约束中。由于一个类只能从一个基类派生,但可以实现多个接口,因此可以在
    ApplicationUser
    中实现
    IEntity
    ,以便将其用作
    IEntityService
    的类型参数 我赞成第一种方法,因为它避免了身份验证环境与持久性的混合

    但是,如果要实现第二种方法,请首先将
    BaseEntity
    重命名为
    IEntity
    ,例如通过访问上下文菜单。这样可以确保在以前使用过
    BaseEntity
    的地方使用新名称。然后改变

    public abstract class IEntity { }
    


    解决你们问题的办法不是把一个方形的钉子塞进一个圆孔里。自己回答这个问题:当应用到项目的标识部分时,通用存储库将给您带来什么好处

    我怀疑会有很多痛苦、咒骂和大量自定义代码,因为
    ApplicationUserManager
    可能无法与您的解决方案配合使用,您必须编写自定义存储或至少部分实现一些逻辑


    仅仅因为有一个模式,并不意味着你必须在任何地方应用它。特别是图案不合适的地方。

    请显示错误本身。不清楚它是从哪里来的。请再看一遍。我更喜欢第二条路。你能用代码解释一下吗?@user3748973我用一个例子扩展了答案。希望能有帮助。
    public abstract class IEntity { }
    
    public interface IEntity { }