gpt4 book ai didi

c# - 没有为实体类型 MyImage 找到合适的构造函数

转载 作者:行者123 更新时间:2023-12-04 00:03:20 25 4
gpt4 key购买 nike

我得到了这个异常(exception):

System.InvalidOperationException HResult=0x80131509 Message=No suitable constructor found for entity type 'MyImage'. The following constructors had parameters that could not be bound to properties of the entity type: cannot bind 'image' in 'MyImage(string name, string country, Image image)'. Source=Microsoft.EntityFrameworkCore StackTrace: at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConstructorBindingConvention.Apply(InternalModelBuilder modelBuilder) at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.ImmediateConventionScope.OnModelBuilt(InternalModelBuilder modelBuilder) at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.OnModelBuilt(InternalModelBuilder modelBuilder) at Microsoft.EntityFrameworkCore.Metadata.Internal.Model.Validate() at Microsoft.EntityFrameworkCore.ModelBuilder.FinalizeModel() at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext context, IConventionSetBuilder conventionSetBuilder, IModelValidator validator) at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.<>c__DisplayClass5_0.b__1() at System.Lazy1.ViaFactory(LazyThreadSafetyMode mode)
at System.Lazy
1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) at 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 argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProviderEngineScope scope) at 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 argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProviderEngineScope scope) at 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 accessor) at Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService[TService](IInfrastructure`1 accessor) at Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade.get_DatabaseCreator() at Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade.EnsureDeleted() at DigitizedApi.Data.DataInitializer.InitializeData() in D:\School\Webapplicaties IV\DigitizedApi\DigitizedApi\DigitizedApi\Data\DataInitializer.cs:line 27 at DigitizedApi.Startup.Configure(IApplicationBuilder app, IHostingEnvironment env, DataInitializer dataInitializer) in 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();
}
}

非常抱歉,我知道代码很多,但我是一名学生,我的老师有点抛弃了我们,我们需要自己找出问题,我不知道可能出了什么问题。

提前致谢!

最佳答案

EF.Core 在内部调用实体构造函数,因此 EF.Core 应该以某种方式确定要作为参数传递的内容。 EF.Core < 2.1 根本无法注入(inject)参数,但从 EF.Core 2.1 开始有可能 - 如果所有参数与属性具有相同的名称,则 EF.Core 使用属性值作为参数值(参见 docs for更多信息):

Starting with EF Core 2.1, it is now possible to define a constructor with parameters and have EF Core call this constructor when creating an instance of the entity. The constructor parameters can be bound to mapped properties, or to various kinds of services to facilitate behaviors like lazy-loading.



在您的情况下,无法解析 Image image参数(EF.Core 2.1,较旧的 EF.Core 根本不起作用),所以简单的解决方案是将默认构造函数添加到您的 MyImage类(class)。

关于c# - 没有为实体类型 MyImage 找到合适的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55285417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com