找不到适合实体类型字符串的合适构造函数

Mou*_*ier 9 c# entity-framework-core

昨天我来问她一个类似的问题,关于我自己的实体类型会出现一些错误。我修复了这些错误,但是现在它在实体类型字符串上抛出了一个错误,我绝对不知道如何解决此错误。

完全例外:

System.InvalidOperationException:'找不到适用于实体类型'string'的合适的构造函数。以下参数无法绑定到实体的属性:“值”,“值”,“ startIndex”,“长度”,“值”,“值”,“ startIndex”,“长度”,“值”,“值”,“ startIndex”,“长度”,“值”,“ startIndex”,“长度”,“ enc”,“ c”,“计数”,“值”。

启动应用程序时会抛出此错误:我编写了一个数据播种器以在数据库中获取一些数据。我已经在我的类范围内,ConfigureServices并在Configure方法中使用它。

public void ConfigureServices(IServiceCollection services) {
        services.Configure<CookiePolicyOptions>(options => {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        services.AddDbContext<ApplicationDbContext>(options =>
           options.UseSqlServer(
               Configuration.GetConnectionString("DefaultConnection")));
        services.AddScoped<IRatingRepository, RatingRepository>();
        services.AddScoped<IReservationRepository, ReservationRepository>();
        services.AddScoped<DataSeeder>();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env,DataSeeder seeder) {
        if (env.IsDevelopment()) {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        } else {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseStatusCodePages();
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseDefaultFiles();
        app.UseCookiePolicy();

        app.UseMvc(routes => {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}"
                );
        });

        seeder.SeedData();
    }
Run Code Online (Sandbox Code Playgroud)

并在此类中引发了错误:

public class DataSeeder {
    #region Fields
    private readonly ApplicationDbContext _context;
    private Random random;
    private ISet<string> _set;
    #endregion

    #region Constructor
    public DataSeeder(ApplicationDbContext context) {
        _context = context;
        random = new Random();
        _set = new HashSet<string>();
    }
    #endregion

    #region Methods
    public void SeedData() {
        _context.Database.EnsureDeleted();
        if (_context.Database.EnsureCreated()) { //**on this line**

            AddCodes();

            //reservations
            Reservation r1 = new Reservation(new DateTime(2019, 2, 21), "Robbe van de Vyver", "Kip met rijst en currysaus", true, "");
            _context.Reservations.Add(r1);

            _context.SaveChanges();
        }
    }

    private void AddCodes() {
        if (_context.Codes.Count() <= 5) {
            char[] characters = "azertyuiopqsdfghjklmwxcvbn,;:=?+-./+~ù%^$*&éè!çà|@#0123456789AZERTYUIOPQSDFGHJKLMWXCVBN".ToArray();
            for (int i = 0; i < 25; i++) {
                string code = "";
                for (int j = 0; j < 4; i++) {
                    code += characters[random.Next(0, characters.Length)];
                }
                _set.Add(code);
            }
            _context.Codes.AddRange(_set);
            _context.SaveChanges();
        }
    } 
    #endregion
Run Code Online (Sandbox Code Playgroud)

但这不是唯一一次引发这种错误的想法,当我尝试加载应用程序的特定页面时也会引发这种错误:

public class ChezMoutController : Controller {

    private IRatingRepository _ratingRepository;
    private IReservationRepository _reservationRepository;

    public ChezMoutController(IRatingRepository ratingRepository, IReservationRepository reservationRepository) {
        _ratingRepository = ratingRepository;
        _reservationRepository = reservationRepository;
    }
    public IActionResult Index() {
        ViewData["foodAverage"] = _ratingRepository.GetAll().Select(r => r.FoodRating).Average();
        ViewData["atmosphereAverage"] = _ratingRepository.GetAll().Select(r => r.AtmosphereRating).Average();
        ViewData["reservations"] = _reservationRepository.GetAll();
        ViewData["DatesLeft"] = new List<DateTime>() { };
        return View(_ratingRepository.GetAll());
    }
}
Run Code Online (Sandbox Code Playgroud)

每次我尝试在此控制器中加载与此索引关联的视图时,都会在此处抛出相同的异常:

public class RatingRepository : IRatingRepository {
    private readonly ApplicationDbContext _context;

    public RatingRepository(ApplicationDbContext context) {
        _context = context;
    }

    public void Add(Rating rating) {
        var any = _context.Ratings.Any(r => r.RatingId == rating.RatingId);
        if (!any) {
            _context.Add(rating);
        }

    }

    public IEnumerable<Rating> GetAll() {
        return _context.Ratings.ToList(); //**on this line**
    }

    public void Remove(Rating rating) {
        var any = _context.Ratings.Any(r => r.RatingId == rating.RatingId);
        if (any) {
            _context.Remove(rating);
        }

    }

    public void SaveChanges() {
        _context.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

(此类实现的接口:)

    public interface IRatingRepository {
    IEnumerable<Rating> GetAll();
    void Add(Rating rating);
    void Remove(Rating rating);
    void SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

我认为这与我的评分等级有关:

public class Rating {
    #region Fields
    private double _foodRating;
    private double _atmosphereRating;
    #endregion

    #region Properties
    public int RatingId { get; set; }
    public double FoodRating {
        get {
            return _foodRating;
        }
        private set {
            if (value < 0.0 || value > 5.0) {
                throw new ArgumentException("Give a score between 0 and 5 please.");
            }
            _foodRating = value;
        }
    }
    public double AtmosphereRating {
        get {
            return _atmosphereRating;
        }
        private set {
            if (value < 0.0 || value > 5.0) {
                throw new ArgumentException("Give a score between 0 and 5 please.");
            }
            _atmosphereRating = value;
        }
    }
    public string PersonalMessage { get; set; } //not mandatory
    public string Suggestions { get; set; } //not mandatory 
    #endregion

    #region Constructors
    public Rating() {

    }

    public Rating(double foodRating, double atmosphereRating, string personalMessage = null, string suggestions = null):this() {
        FoodRating = foodRating;
        AtmosphereRating = atmosphereRating;
        PersonalMessage = personalMessage;
        Suggestions = suggestions;
    }
    #endregion

}
Run Code Online (Sandbox Code Playgroud)

但是我不知道该怎么办。任何帮助,将不胜感激!

ApplicationDbContext:

 public class ApplicationDbContext : DbContext {
    public DbSet<Rating> Ratings { get; set; }
    public DbSet<Reservation> Reservations { get; set; }
    public DbSet<string> Codes { get; set; }

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }

    protected override void OnModelCreating(ModelBuilder modelBuilder) {
        modelBuilder.ApplyConfiguration(new RatingConfiguration());
        modelBuilder.ApplyConfiguration(new ReservationConfiguration());
    }
}
Run Code Online (Sandbox Code Playgroud)

评级配置

public class RatingConfiguration : IEntityTypeConfiguration<Rating> {
    public void Configure(EntityTypeBuilder<Rating> builder) {
        builder.ToTable("Rating");

        builder.HasKey(r => r.RatingId);

        builder.Property(r => r.PersonalMessage)
            .HasMaxLength(250)
            .IsRequired(false);

        builder.Property(r => r.Suggestions)
            .HasMaxLength(250)
            .IsRequired(false);
    }
}
Run Code Online (Sandbox Code Playgroud)

Bro*_*ony 11

刚刚遇到了类似的问题。

我有一个类并且正在做一些更改并删除了默认的类构造函数。尽管它从未被称为 EF 仍然需要它,否则您将得到一个 No合适的构造函数发现异常

public class Company
{
    public  Company ( )
    {
      // ef needs this constructor even though it is never called by 
     // my code in the application. EF needs it to set up the contexts

      // Failure to have it will result in a 
      //  No suitable constructor found for entity type 'Company'. exception
    }

    public Company ( string _companyName , ......)
    {
         // some code
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 从 EF Core 2.1 开始,情况不再如此;您不需要 EF Core 的空构造函数。[EF Core 文档](https://docs.microsoft.com/en-us/ef/core/modeling/constructors) 指出 __当 EF Core 创建实例时 [...] 它将首先调用默认的无参数构造函数 [ ...]。但是,如果 EF Core 找到参数化构造函数 [...],那么它将使用这些属性的值调用参数化构造函数__ (2认同)

Dav*_*idG 8

问题出在您的上下文中,您具有以下行:

public DbSet<string> Codes { get; set; }
Run Code Online (Sandbox Code Playgroud)

您需要为实体使用一个具体的类,string不能使用a。