【发布时间】:2022-01-04 20:35:35
【问题描述】:
我尝试使用 Multiple DbContext 将项目的每个域迁移到不同的数据库,如下所示:
public class AppDbContext: DbContext
.
.
public class UserAccessDbContext: DbContext
.
.
public class AdministrationDbContext: DbContext
.
.
Etc
但看起来我做错了什么,所以我得到了每个 DbContext 中的所有表,我没有任何链接域的 FK。
每个 DbContext 的连接字符串如下:
public static void AppDbContext(this IServiceCollection services, string connectionString) =>
services.AddDbContext<AppDbContext>(options => options.UseMySql(connectionString, new MySqlServerVersion(new Version(8, 0, 27))));
public static void UserAccessDbContext(this IServiceCollection services, string connectionString) =>
services.AddDbContext<UserAccessDbContext>(options => options.UseMySql(connectionString, new MySqlServerVersion(new Version(8, 0, 27))));
public static void AdministrationDbContext(this IServiceCollection services, string connectionString) =>
services.AddDbContext<AdministrationDbContext>(options => options.UseMySql(connectionString, new MySqlServerVersion(new Version(8, 0, 27))));
我的存储库是这样的:
public class AppRepository<T> : RepositoryBase<T>, IReadRepository<T>, IRepository<T> where T : class, IAggregateRoot
{
public AppRepository(AppDbContext appDbContext) : base(appDbContext)
{
}
}
.
.
.
public class AdministrationRepository<T> : RepositoryBase<T>, IReadRepository<T>, IRepository<T> where T : class, IAggregateRoot
{
public AdministrationRepository(AdministrationDbContext administrationdbContext) : base(administrationdbContext)
{
}
}
.
.
.
public class UserAccessRepository<T> : RepositoryBase<T>, IReadRepository<T>, IRepository<T> where T : class, IAggregateRoot
{
public UserAccessRepository(UserAccessDbContext userAccessdbContext) : base(userAccessdbContext)
{
}
}
我也像这样注册了 repo:
public class DefaultInfrastructureModule : Module
{
private readonly bool _isDevelopment = false;
private readonly List<Assembly> _assemblies = new List<Assembly>();
public DefaultInfrastructureModule(bool isDevelopment, Assembly? callingAssembly = null)
{
_isDevelopment = isDevelopment;
var coreAssembly = Assembly.GetAssembly(typeof(User)); // TODO: Replace "Project" with any type from your Core project
var infrastructureAssembly = Assembly.GetAssembly(typeof(StartupSetup));
if (coreAssembly != null)
{
_assemblies.Add(coreAssembly);
}
if (infrastructureAssembly != null)
{
_assemblies.Add(infrastructureAssembly);
}
if (callingAssembly != null)
{
_assemblies.Add(callingAssembly);
}
}
protected override void Load(ContainerBuilder builder)
{
if (_isDevelopment)
{
RegisterDevelopmentOnlyDependencies(builder);
}
else
{
RegisterProductionOnlyDependencies(builder);
}
RegisterCommonDependencies(builder);
}
private void RegisterCommonDependencies(ContainerBuilder builder)
{
//Start Repository Reg
builder.RegisterGeneric(typeof(AppRepository<>))
.As(typeof(IRepository<>))
.As(typeof(IReadRepository<>))
.InstancePerLifetimeScope();
builder.RegisterGeneric(typeof(AdministrationRepository<>))
.As(typeof(IRepository<>))
.As(typeof(IReadRepository<>))
.InstancePerLifetimeScope();
builder.RegisterGeneric(typeof(UserAccessRepository<>))
.As(typeof(IRepository<>))
.As(typeof(IReadRepository<>))
.InstancePerLifetimeScope();
//End Repository Reg
builder
.RegisterType<Mediator>()
.As<IMediator>()
.InstancePerLifetimeScope();
builder.Register<ServiceFactory>(context =>
{
var c = context.Resolve<IComponentContext>();
return t => c.Resolve(t);
});
var mediatrOpenTypes = new[]
{
typeof(IRequestHandler<,>),
typeof(IRequestExceptionHandler<,,>),
typeof(IRequestExceptionAction<,>),
typeof(INotificationHandler<>),
};
foreach (var mediatrOpenType in mediatrOpenTypes)
{
builder
.RegisterAssemblyTypes(_assemblies.ToArray())
.AsClosedTypesOf(mediatrOpenType)
.AsImplementedInterfaces();
}
builder.RegisterType<EmailSender>().As<IEmailSender>()
.InstancePerLifetimeScope();
}
private void RegisterDevelopmentOnlyDependencies(ContainerBuilder builder)
{
// TODO: Add development only services
}
private void RegisterProductionOnlyDependencies(ContainerBuilder builder)
{
// TODO: Add production only services
}
}
我在我的代码中错过了什么来修复它!
任何帮助我该怎么做。
【问题讨论】:
-
考虑到你不能有同名表的上下文,因为它们之间会发生崩溃类,即使它们在不同的实体模型中。
-
"so I get all Tables in each DbContext"你能详细说明一下吗?
-
亲爱的@LeandroBardelli 我用更多细节更新我的问题。
-
亲爱的@GuruStron 你也可以检查我的更新。
-
对不起@sumer5020 但我们不以这种方式工作,我们需要具体的问题或代码来帮助您。请阅读有关如何提问的教程和指南
标签: c# entity-framework asp.net-core domain-driven-design .net-6.0