C# EF 6.1.3多数据库(MSSQL)通用存储库;“相同表名”;
因此我有两个不同的DbContext(ef 6.1.3代码优先)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
- FirstDbContext
- SecondDbContext
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数据库:
- 数据库优先
- 秒
编辑#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>();
}
}