Lamar脚手架实体框架控制器

时间:2019-01-11 04:26:56

标签: c# entity-framework-core asp.net-core-2.0 lamar

我在.NET Core 2项目中设置了Lamar:

    public class Program
    {
        public static void Main(string[] args)
        {
            IWebHost webhost = CreateWebHostBuilder(args).Build();
            //((Container)webhost.Services).GetInstance<IStart>().Run();
            webhost.Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseLamar()
                .UseStartup<Startup>();
    }

...

    public class Startup
    {
    ...
        public void ConfigureContainer(ServiceRegistry services)
        {
            services.Configure<Configuration.Auth>("auth", Configuration);
            ...
            services.Scan(s =>
            {
                s.TheCallingAssembly();
                s.WithDefaultConventions();
            });
            services.AddCors();
            services.AddMvc()
                .AddJsonOptions(o =>
                {
                    o.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                    o.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
                })
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            services.AddDbContext<Context>(options => options.UseSqlServer(Configuration.GetConnectionString("defaultConnection")));
        }
    }

但是,当尝试使用带有实体框架的Scaffold API控制器进行操作时,我遇到以下错误:

运行所选代码生成器时发生错误:“未为此对象定义无参数构造函数。”

查找此https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/?view=aspnetcore-2.2#update-main-method-in-programcs表示,这可以在试图仍然使用.NET 1.x结构的ASP.NET Core 2项目中显示。

我发现了一个变通方法,我将在下面发布,这表明脚手架代码生成可能与Lamar有关。但是,有没有更好的解决方案?您可以设置Lamar使其能够处理实体框架代码生成吗?

1 个答案:

答案 0 :(得分:0)

考虑到EF在“生成代码”部分失败,我想知道问题是否可能不是无参数构造函数(我很确定它所引用的任何未命名对象实际上都有一个),而是WebHost的获取方式问题使用Lamar时建立。

Lamar documentation中有关与ASP.NET Core状态集成的注释

  

注意! Startup.ConfigureServices(ServiceRegistry)约定从ASP.Net Core 2.1开始不起作用。请改用ConfigureContainer(ServiceRegistry)

我在启动中使用了Lamar函数;但是,如果我将其改回ConfigureContainer(IServiceCollection services)(并注释掉了Lamar特定的功能,例如“扫描”),我发现我可以再次支撑EF控制器。

因此,目前,我的解决方法是在脚手架之前注释掉Lamar,然后在完成后取消注释。我怀疑可能会有更好的解决方案...