如果项目较小,只有内部调用等,为了避免重新定义基础设施服务上下文和模型等,我们可以将基础设施服务上下文打包成nuget包形式或项目引用方法等,然后其他服务上下文继承了基础设施上下文,这样我们就可以操作基础设施模型了,那怎么办呢?实现上下文继承,我们从头开始,比如定义其他服务上下文和模型等。>测试{得到;放;}}[Table("tests")]publicclassTest{[Column("id")]publicintId{get;放;}[Column("name")]publicstringName{get;放;}}接下来,我们使用控制台程序注入上下文,查询表数据,最基本的操作,不用我多说了staticvoidMain(string[]args){varservices=newServiceCollection();services.AddDbContext(options=>{options.UseSqlServer("DataSource=.;InitialCatalog=EFCore;UserID=sa;Password=sa123;");});varserviceProvider=services.BuildServiceProvider();varcontext=serviceProvider.GetRequiredService();varresult=JsonConvert.SerializeObject(context.Tests.ToList());}这时候上面的服务上下文需要调用基础服务上下文,怎么办呢?首先定义基本服务上下文publicclassBaseDbContext:DbContext{publicBaseDbContext(DbContextOptionsoptions):base(options){}publicDbSetUsers{get;放;}}[Table("users")]publicclassUser{[Column("id")]publicintId{get;放;}[Column("name")]publicstringName{get;放;}[Column("birthdate")]publicDateTimeBirthDate{get;放;}[Column("address")]publicstringAddress{get;放;}}接下来我们从上面的基础服务上下文中继承其他服务上下文TestDbContextpublicclassTestDbContext:BaseDbContext{publicTestDbContext(DbContextOptionsoptions):base(options){}......}这时候,编译器会报CS1503错误,无法将TestDbContext转换成BaseContext,因为构造函数参数不匹配,我们知道DbContextOptions是DbContextOptions的父类,所以我们只需要在BaseDbContextpublicclassBaseDbContext中添加一个新的构造函数:DbContext{publicBaseDbContext(DbContextOptionsoptions):base(options){}publicBaseDbContext(DbContextOptionsoptions):base(options){}......}这样我们就可以在基础服务上下文中操作模型了,如下varcontext=serviceProvider.GetRequiredService();varresult=JsonConvert.SerializeObject(context.Users.ToList());我们在这里完成了吗?当然不是。如果此时我们直接通过基础服务上下文进行操作,发现抛出如下异常是什么意思呢?按照一般的意思,就是context的构造器有问题,所以context的创建无法启动,那么根本原因是什么呢?这个问题在之前的博文中其实已经解释过了,源码如下:!c.IsStatic&&c.IsPublic).ToArray();if(constructors.Length==1){varparameters=constructors[0].GetParameters();if(parameters.Length==1&&(parameters[0].ParameterType==typeof(DbContextOptions)||parameters[0].ParameterType==typeof(DbContextOptions))){返回Expression.Lambda>(Expression.New(constructors[0],Expression.Constant(options))).Compile();}}returnnull;}首先获取context中声明的构造函数,过滤掉static和public,并且context必须有且只能有一个显式构造函数且参数只能是DbContextOptions,我们恍然大悟,我们可以将新添加的构造函数访问修饰符更改为受保护的(受保护的)publicclassBaseDbContext:DbContext{publicBaseDbContext(DbContextOptionsoptions):base(options){}protectedBaseDbContext(DbContextOptionsoptions):base(options){}......}呵呵,没什么好总结的,这个东西只能靠经验或者看源码来猜测,再见!