C# 在asp.net core和实体框架core中使用两个上下文的正确方法
我正在尝试应用我一直在学习的东西,并且我已经参与了一部分上下文 我尝试应用的是Microsoft.Identity结构以及应用程序实体 解决方案的结构:C# 在asp.net core和实体框架core中使用两个上下文的正确方法,c#,asp.net,entity-framework,dbcontext,asp.net-identity-2,C#,Asp.net,Entity Framework,Dbcontext,Asp.net Identity 2,我正在尝试应用我一直在学习的东西,并且我已经参与了一部分上下文 我尝试应用的是Microsoft.Identity结构以及应用程序实体 解决方案的结构: BaseFull.Web BaseFull.Entities BaseFull.Infra.Data 我已经创建了一个接口来保留相同的新属性,因此不存在将两个类迁移到同一个“表”的问题 public interface IUsuario { string Fullname { get; set; } } 我已应用于我的用户实体和应用
BaseFull.Web
BaseFull.Entities
BaseFull.Infra.Data
我已经创建了一个接口来保留相同的新属性,因此不存在将两个类迁移到同一个“表”的问题
public interface IUsuario
{
string Fullname { get; set; }
}
我已应用于我的用户实体和应用程序用户:
namespace BaseFull.Web.Models
{
// Add profile data for application users by adding properties to the ApplicationUser class
public class ApplicationUser : IdentityUser, IUsuario
{
public string Fullname { get; set; }
}
}
namespace BaseFull.Entities.Models
{
public class Usuario : IUsuario
{
public string Fullname { get; set; }
public Usuario()
{
Id = Guid.NewGuid().ToString();
}
#region Propriedades da AspnetUsers(Identity)
public string Id { get; set; }
public virtual string Email { get; set; }
public virtual string UserName { get; set; }
...
#endregion
}
我已经在一个项目中分离了实体。我还试图在一个项目中分离上下文,正是在这个时候,我遇到了困难
namespace BaseFull.Infra.Data.Context
{
public class BaseFullContext: DbContext
{
public DbSet<Usuario> Usuarios { get; set; }
....
namespace BaseFull.Web.Data
{
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<ApplicationUser>().ToTable("Usuarios");
我最大的问题是如何解决这个问题,这是使用这两种上下文的最正确和有效的方法
此处没有显示与ApplicationUser相同的用户配置类,因为我认为没有必要,但如果需要,我也会显示它。将表分为两个上下文需要什么用例?这将使在两种上下文之间编写查询变得困难。它需要在应用程序内存中而不是在sql server中完成来自两个上下文的连接。我的建议是将所有表放入
ApplicationDbContext
。如果你愿意,我可以告诉你怎么做,让我知道。完全同意@davidele,你不应该让两个上下文共享同一个连接字符串。如果它们是不同的连接字符串(例如,连接到两个不同的数据库),则更有意义。但是这两者之间没有任何关系,甚至连继承都没有。在处理有界上下文时,您可能会使用类似的方法,但从OP示例中,我看不出这是如何适用的。这几乎就像他们看到了2个不同的上下文设置示例,并设置了2个,每种方式一个??对于原始问题:要使一个表同时出现在两个上下文中,那么只有一个上下文可以作为CodeFirst表结构的所有者。必须将其他所有上下文配置为不创建/迁移架构。对于有界上下文,我不使用CodeFirst,但即使这样,也只有一个上下文可以是任何给定实体的所有者;根据你们所展示的,我无法理解的一件事是,为什么你们需要2个上下文,你们想实现什么?您可以将2个上下文用于2个单独的数据库,也可以使用一个标识数据库并扩展它。将表分隔为两个上下文需要什么用例?这将使在两种上下文之间编写查询变得困难。它需要在应用程序内存中而不是在sql server中完成来自两个上下文的连接。我的建议是将所有表放入ApplicationDbContext
。如果你愿意,我可以告诉你怎么做,让我知道。完全同意@davidele,你不应该让两个上下文共享同一个连接字符串。如果它们是不同的连接字符串(例如,连接到两个不同的数据库),则更有意义。但是这两者之间没有任何关系,甚至连继承都没有。在处理有界上下文时,您可能会使用类似的方法,但从OP示例中,我看不出这是如何适用的。这几乎就像他们看到了2个不同的上下文设置示例,并设置了2个,每种方式一个??对于原始问题:要使一个表同时出现在两个上下文中,那么只有一个上下文可以作为CodeFirst表结构的所有者。必须将其他所有上下文配置为不创建/迁移架构。对于有界上下文,我不使用CodeFirst,但即使这样,也只有一个上下文可以是任何给定实体的所有者;根据你们所展示的,我无法理解的一件事是,为什么你们需要2个上下文,你们想实现什么?您可以将2个上下文用于2个单独的数据库,也可以使用一个标识数据库并对其进行扩展
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddDbContext<BaseFullContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));....
services.AddDbContext<BaseFullAppContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")
, b => b.MigrationsAssembly("BaseFull.Web"))
There is already an object named 'Usuarios' in the database.