我遇到此异常:
System.InvalidOperationException HResult = 0x80131509 Message =找不到适合实体类型“ MyImage”的构造函数。以下构造函数的参数无法绑定到实体类型的属性:无法绑定“ MyImage(字符串名称,字符串国家/地区,图像图像)”中的“图像”。 源= Microsoft.EntityFrameworkCore 堆栈跟踪: 在Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConstructorBindingConvention.Apply(InternalModelBuilder modelBuilder) 在Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.ImmediateConventionScope.OnModelBuilt(InternalModelBuilder modelBuilder) 在Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.OnModelBuilt(InternalModelBuilder modelBuilder) 在Microsoft.EntityFrameworkCore.Metadata.Internal.Model.Validate() 在Microsoft.EntityFrameworkCore.ModelBuilder.FinalizeModel() 在Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext上下文,IConventionSetBuilder ConventionSetBuilder,IModelValidator验证程序) 在Microsoft.EntityFrameworkCore.Infrastructure.ModelSource。<> c__DisplayClass5_0.b__1() 在System.Lazy
中的DigitizedApi.Startup.Configure(IApplicationBuilder app,IHostingEnvironment env,DataInitializer dataInitializer)中1.ViaFactory(LazyThreadSafetyMode mode) at System.Lazy
1.ExecutionAndPublication(LazyHelper执行AndPublication,布尔值useDefaultConstructor)处 在System.Lazy1.CreateValue() at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel(DbContext context, IConventionSetBuilder conventionSetBuilder, IModelValidator validator) at Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel() at Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model() at Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServicesBuilder.<>c.<TryAddCoreServices>b__7_2(IServiceProvider p) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite(IServiceCallSite callSite,TArgument参数)处 在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite,ServiceProviderEngineScope范围) 在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite(IServiceCallSite callSite,TArgument参数)处 在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite,ServiceProviderEngineScope范围) 在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies() at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider() at Microsoft.EntityFrameworkCore.DbContext.Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure<System.IServiceProvider>.get_Instance() at Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade.Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure<System.IServiceProvider>.get_Instance() at Microsoft.EntityFrameworkCore.Internal.InternalAccessorExtensions.GetService[TService](IInfrastructure
1访问器处) 在Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService [TService](IInfrastructure`1访问器)处 在Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade.get_DatabaseCreator() 在Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade.EnsureDeleted() 在D:\ School \ Webapplicaties IV \ DigitizedApi \ DigitizedApi \ DigitizedApi \ Data \ DataInitializer.cs:第27行中的DigitizedApi.Data.DataInitializer.InitializeData() 在D:\ School \ Webapplicaties IV \ DigitizedApi \ DigitizedApi \ DigitizedApi \ Startup.cs:line 103
我不知道原因可能是什么。
public class ApplicationDbContext : IdentityDbContext {
public DbSet<MyImage> Images { get; set; }
public DbSet<Visitor> Visitors { get; set; }
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options) {
}
protected override void OnModelCreating(ModelBuilder builder) {
base.OnModelCreating(builder);
builder.ApplyConfiguration(new ImageConfiguration());
builder.ApplyConfiguration(new VisitorConfiguration());
builder.ApplyConfiguration(new ImageVisitorConfiguration());
}
}
private readonly ApplicationDbContext _dbContext;
private readonly UserManager<IdentityUser> _userManager;
private readonly IImageRepository _imageRepository;
public DataInitializer(ApplicationDbContext context, UserManager<IdentityUser> userManager, IImageRepository imageRepository) {
_dbContext = context;
_userManager = userManager;
_imageRepository = imageRepository;
}
//public async Task InitializeData() {
// _dbContext.Database.EnsureDeleted();
// if (_dbContext.Database.EnsureCreated()) {
// }
//}
public void InitializeData() {
_dbContext.Database.EnsureDeleted();//error gets thrown here
if (_dbContext.Database.EnsureCreated()) {
//MyImage image1 = new MyImage("Parallax1","France",Image.FromFile("DSC_2544c2.jpg"));
//_imageRepository.Add(image1);
_imageRepository.SaveChanges();
}
}
private async Task CreateUser(string email, string password) {
var user = new IdentityUser { UserName = email, Email = email };
await _userManager.CreateAsync(user, password);
}
}
public class MyImage {
#region Fields
private string _name;
#endregion
#region Properties
public int Id { get; set; }
[Required]
public string Name {
get {
return _name;
}
set {
if (string.IsNullOrEmpty(value) || string.IsNullOrWhiteSpace(value)) {
throw new ArgumentException("Name cannot be empty.");
}
_name = value;
}
}
public int ISO { get; set; }
public double ShutterSpeed { get; set; }
public double Aperture { get; set; }
public string Country { get; set; }
public string Content { get; set; }
#endregion
#region Constructor
//public MyImage(string name, int iso, double shutterspeed, double aperture, string country, string content) {
// Name = name;
// ISO = iso;
// ShutterSpeed = shutterspeed;
// Aperture = aperture;
// Country = country;
// Content = content;
//}
public MyImage(string name, string country, Image image) {
Name = name;
ISO = Convert.ToInt32(Encoding.UTF8.GetString(image.GetPropertyItem(0x8828).Value));
ShutterSpeed = Convert.ToInt64(Encoding.UTF8.GetString(image.GetPropertyItem(0x9201).Value));
Aperture = Convert.ToInt32(Encoding.UTF8.GetString(image.GetPropertyItem(0x9202).Value)); ;
Country = country;
Content = ConvertImage(image);
}
#endregion
#region Methods
private string ConvertImage(Image imageToConvert) {
byte[] Ret;
try {
using (MemoryStream ms = new MemoryStream()) {
imageToConvert.Save(ms, imageToConvert.RawFormat);
Ret = ms.ToArray();
}
} catch (Exception ex) {
throw;
}
return Convert.ToBase64String(Ret);
}
#endregion
}
public class ImageConfiguration : IEntityTypeConfiguration<MyImage> {
public void Configure(EntityTypeBuilder<MyImage> builder) {
builder.ToTable("Image");
builder.HasKey(i => i.Id);
builder.Property(i => i.Name)
.HasMaxLength(40)
.IsRequired(true);
builder.Property(i => i.Country)
.HasMaxLength(84)
.IsRequired(true);
builder.Property(i => i.Content)
.IsRequired(true);
}
}
public class Visitor {
#region Fields
private string _name;
private string _email;
private string _telephone;
#endregion
#region Properties
public int Id { get; set; }
public string Name {
get {
return _name;
}
set {
if (string.IsNullOrEmpty(value) || string.IsNullOrWhiteSpace(value)) {
throw new ArgumentException("Name can't be empty.");
}
_name = value;
}
}
public string Email {
get {
return _email;
}
set {
if (string.IsNullOrEmpty(value) || string.IsNullOrWhiteSpace(value)) {
throw new ArgumentException("Email can't be empty.");
}
Regex regex = new Regex(@"^([a-zA-Z0-9éèà]+[a-zA-Z0-9.-éèàïëöüäîôûêâù]*)@([a-zA-Z]+)[.]([a-z]+)([.][a-z]+)*$");
Match match = regex.Match(value);
if (!match.Success) {
throw new ArgumentException("Email doesn't have a correct format.");
}
_email = value;
}
}
public string Telephone {
get {
return _telephone;
}
set {
if (string.IsNullOrEmpty(value) || string.IsNullOrWhiteSpace(value)) {
throw new ArgumentException("Telephone number can't be empty.");
}
Regex regex = new Regex(@"(\+(0)?|00)(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)\d{1,14}$");
Match match = regex.Match(value);
if (!match.Success) {
throw new ArgumentException("Telephone number doesn't have a correct format. " +
"Please make sure you use an international phone number (+44791112345) and dont forget to add the +.");
}
_telephone = value;
}
}
public string Country { get; set; }
public ICollection<LikedImage> Liked { get; private set; }
public IEnumerable<MyImage> LikedImages => Liked.Select(i => i.Image);
#endregion
#region Constructor
public Visitor(string name, string email, string telephone, string country = null) {
Name = name;
Email = email;
Telephone = telephone;
Country = country;
}
#endregion
}
public class VisitorConfiguration : IEntityTypeConfiguration<Visitor> {
public void Configure(EntityTypeBuilder<Visitor> builder) {
builder.ToTable("Visitors");
builder.HasKey(v => v.Id);
builder.Property(v => v.Name)
.HasMaxLength(50)
.IsRequired(true);
builder.Property(v => v.Email)
.HasMaxLength(70)
.IsRequired(true);
builder.Property(v => v.Telephone)
.HasMaxLength(15)
.IsRequired(true);
}
}
public class LikedImage {
#region Properties
public int ImageId { get; set; }
public int VisitorId { get; set; }
public Visitor Visitor { get; set; }
public MyImage Image { get; set; }
#endregion
}
public class ImageVisitorConfiguration : IEntityTypeConfiguration<LikedImage> {
public void Configure(EntityTypeBuilder<LikedImage> builder) {
builder.HasKey(i => new { i.ImageId, i.VisitorId });
builder.HasOne(i => i.Visitor)
.WithMany(v => v.Liked)
.HasForeignKey(i => i.VisitorId);
builder.HasOne(i => i.Image)
.WithMany()
.HasForeignKey(i => i.ImageId);
}
}
最后
public class Startup {
public Startup(IConfiguration configuration) {
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services) {
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DigitizedContext")));
services.AddScoped<DataInitializer>();
services.AddScoped<IImageRepository, ImageRepository>();
services.AddScoped<IVisitorRepository, VisitorRepository>();
services.AddOpenApiDocument(c => {
c.DocumentName = "apidocs";
c.Title = "DigitizedAPI";
c.Version = "v1";
c.Description = "The DigitizedAPI documentation description.";
c.DocumentProcessors.Add(new SecurityDefinitionAppender("JWT Token", new SwaggerSecurityScheme {
Type = SwaggerSecuritySchemeType.ApiKey,
Name = "Authorization",
In = SwaggerSecurityApiKeyLocation.Header,
Description = "Copy 'Bearer' + valid JWT token into field"
}));
c.OperationProcessors.Add(new OperationSecurityScopeProcessor("JWT Token"));
});
services.AddIdentity<IdentityUser, IdentityRole>(cfg => cfg.User.RequireUniqueEmail = true).AddEntityFrameworkStores<ApplicationDbContext>();
services.Configure<IdentityOptions>(options => {
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 3;
options.Lockout.AllowedForNewUsers = true;
options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-._@+";
options.User.RequireUniqueEmail = true;
});
services.AddAuthentication(x => {
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x => {
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters {
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"])),
ValidateIssuer = false,
ValidateAudience = false,
RequireExpirationTime = true
};
});
//change later to the origen of my site
services.AddCors(options =>
options.AddPolicy("AllowAllOrigins", builder => builder.AllowAnyOrigin()
));
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, DataInitializer dataInitializer) {
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
} else {
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseMvc();
app.UseSwaggerUi3();
app.UseSwagger();
app.UseCors("AllowAllOrigins");
//dataInitializer.InitializeData().Wait();
dataInitializer.InitializeData();
}
}
非常抱歉,我知道代码很多,但是我是学生,我的老师已经抛弃了我们,我们需要自己找出问题,我不知道有什么问题
谢谢!
答案 0 :(得分:1)
EF.Core在内部调用实体构造函数,因此EF.Core应该以某种方式确定要作为参数传递的内容。 EF.Core <2.1根本无法注入参数,但是从EF.Core 2.1开始,这是可能的-如果所有参数的名称都与属性相同,则EF.Core会将属性值用作参数值(请参阅{{3} }以获取更多信息):
从EF Core 2.1开始,现在可以定义带有参数的构造函数,并在创建实体实例时让EF Core调用该构造函数。构造函数参数可以绑定到映射的属性,也可以绑定到各种服务以促进诸如延迟加载的行为。
在您的情况下,无法解析Image image
参数(EF.Core 2.1,较旧的EF.Core根本无法使用),因此简单的解决方案是将默认构造函数添加到MyImage
课。