Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.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# EF 6.1.3多数据库(MSSQL)通用存储库;“相同表名”;_C#_Entity Framework_Asp.net Core - Fatal编程技术网

C# EF 6.1.3多数据库(MSSQL)通用存储库;“相同表名”;

C# EF 6.1.3多数据库(MSSQL)通用存储库;“相同表名”;,c#,entity-framework,asp.net-core,C#,Entity Framework,Asp.net Core,因此我有两个不同的DbContext(ef 6.1.3代码优先) FirstDbContext SecondDbContext 每个上下文都包含一个SbSet Users,用于映射相应数据库中的用户表 注意:数据不同,DbFirst用户不是DbSecond用户 我有一个抽象存储库: public abstract class Repository<TContext> where TContext : DbContext { public Repository(TConte

因此我有两个不同的DbContext(ef 6.1.3代码优先)

  • FirstDbContext
  • SecondDbContext
每个上下文都包含一个SbSet Users,用于映射相应数据库中的用户表 注意:数据不同,DbFirst用户不是DbSecond用户

我有一个抽象存储库:

public abstract class Repository<TContext> where TContext : DbContext
{
    public Repository(TContext ctx)
    {
    }
}
公共抽象类存储库,其中TContext:DbContext
{
公共存储库(TContext ctx)
{
}
}
和2个存储库:

public FirstRepo : Repository<FirstDbContext>
{
    public FirstRepo(FirstDbContext ctx):base(ctx)
    {
    }
}

public SecondRepo : Repository<SecondDbContext>
{
    public SecondRepo(SecondDbContext ctx):base(ctx)
    {
    }
}
public FirstRepo:Repository
{
公共FirstRepo(FirstDbContext ctx):基本(ctx)
{
}
}
公共存储库
{
公共SecondRepo(SecondDbContext ctx):基本(ctx)
{
}
}
我有两个与上下文相关的不同MSSQL数据库:

  • 数据库优先
我使用依赖项注入来添加作用域存储库和上下文,2个数据库,2个不同的连接

我希望我的.Net核心应用程序将使用两种模型 但一旦我从两个上下文中获得数据,我就会

NotSupportedException:类型“First.User”和 “Second.User”都具有相同的 “User”和so不能在同一模型中使用

为什么是同一型号

我知道在同一个模型中,我应该有不同的名称,因为EF不寻找名称空间,但在这种情况下,我不应该有这种问题


编辑#1: 如果我单独使用一个存储库,那么一切都会按预期工作,因此我确信没有任何错误的名称空间 例如,如果我一起使用存储库,我就会出现这个错误

var top10 = FirstRepo.GetTop10().ToList();
var sam = SecondRepo.GetByName<Second.User>("sam");
var top10=FirstRepo.GetTop10().ToList();
var sam=SecondRepo.GetByName(“sam”);

编辑2(@Steve Green):

//请注意,我不是在尝试这样做:
公共类MyTextContext:DbContext
{
公共数据库集安全问题{get;set;}
公共DbSet表单_问题{get;set;}
}
//我需要的是这样的东西:
公共类SecurityContext:DbContext
{
公共数据库集问题{get;set;}
}
公共类FormsContext:DbContext
{
公共数据库集问题{get;set;}
}
重要提示 如果我手动忽略这两个上下文中的“其他”实体,一切都会正常工作 我注意到上下文不仅在不同的名称空间中,而且在不同的程序集中

// this is working!! .___.
// but i don't want to add a reference to a project just to exclude a class... it's unacceptable 
public class FirstDbContext : DbContext 
{
    public DbSet<First.User> Users {get;set;}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Ignore<Second.User>();
    }
}

public class SecondDbContext : DbContext 
{
    public DbSet<Second.User> Users {get;set;}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Ignore<First.Usere>();
    }
}
//这很有效!!。\。
//但我不想仅仅为了排除类而添加对项目的引用。。。这是不能接受的
公共类FirstDbContext:DbContext
{
公共数据库集用户{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
Ignore();
}
}
公共类SecondDbContext:DbContext
{
公共数据库集用户{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
Ignore();
}
}

任何与重命名表格不同的建议将不胜感激


谢谢

因为这两种类型都是命名用户,您确定没有因为使用而将它们混淆在一起吗?就像在第一个上下文中将DbSet声明为Second.User类型一样。谢谢你的回答,是的,我确信没有任何错误的名称空间。如果我单独使用一个存储库(第一个或第二个并不重要),一切都很好,如果我将它们混合在一起(使用分离的和具体化的查询),我会得到这个错误,似乎不是使用两个不同的模型,而是只创建了一个(有两个不同的连接???我不理解)用户类型是否以任何方式相关?它们是否派生自公共基类?无论哪种方法,简单的尝试都是重命名其中一个,并显式地将它们映射到它们的表中,这样您就可以排除EF代码中的内部冲突我猜现在,每个实体都有ComponentModel.DataAnnotations提供的[table]属性,我仔细检查了一下,没有任何交叉引用。您认为显式映射inisde OnModelCreating会更好吗?我尝试将用户重命名为User1,现在我在另一个表“Customer”上得到了相同的错误,该表与每个数据库中的表用户相同,但它仅存在于FirstDbContext中,而不存在于SecondDbContext中,似乎问题与[Table]属性…由于这两种类型都是命名用户,您确定没有因为使用而将它们混淆在一起吗?就像在第一个上下文中将DbSet声明为Second.User类型一样。谢谢您的回答,是的,我确信没有任何错误的名称空间。如果我单独使用其中一个存储库(第一个或第二个不重要)一切都很好,如果我把它们混在一起(使用分离的和具体化的查询),我会得到这个错误,似乎不是使用两个不同的模型,而是只创建了一个(有两个不同的连接???我不理解)用户类型是否以任何方式相关?它们是否派生自一个公共基类?无论哪种方式,简单的尝试都是重命名其中一个并显式地将其映射到其表,这样您就可以排除EF代码中的内部冲突我猜目前,每个实体都有[table]属性,我仔细检查了是否没有任何交叉引用。您认为在ModelCreating上显式映射inisde会更好吗?我尝试将用户重命名为User1,现在在另一个表“Customer”上出现了相同的错误,该表作为表用户在每个数据库中都可用,但它仅存在于FirstDbContext中,而不存在于SecondDbContext中,似乎问题与[table]属性的使用有关。。。
// this is working!! .___.
// but i don't want to add a reference to a project just to exclude a class... it's unacceptable 
public class FirstDbContext : DbContext 
{
    public DbSet<First.User> Users {get;set;}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Ignore<Second.User>();
    }
}

public class SecondDbContext : DbContext 
{
    public DbSet<Second.User> Users {get;set;}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Ignore<First.Usere>();
    }
}