带有Entity Framework的Blazor Webassembly失败,显示“不支持ContentType;支持的类型为'application / json'”

时间:2020-06-11 20:13:46

标签: c# entity-framework blazor webassembly

这是我用来了解其工作原理的简单CRUD应用程序。我以前使用过Entity Framework,但对其工作原理知之甚少。此应用程序的数据库包含一个表Employee和6个常见类型的列。我下载了System.Text.Json之前编写的同一应用程序的工作副本,因此数据库连接正常。

GetEmployee.razor中的呼叫是:

@code {
    private Employee[] empList;
    protected override async Task OnInitializedAsync()
    {
        try
        {
            empList = await Http.GetFromJsonAsync<Employee[]>("/api/Employee/Index");
        }
        catch (Exception ex)
        {
            string foo = ex.ToString();
        }
    }
}

namespace Clean.Server.Api
{
    public partial class ManagementContext : DbContext
    {
        public ManagementContext()
        {
        }

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

        public virtual DbSet<Employee> Employee { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
                optionsBuilder.UseSqlServer("Server=MtLyell\\SQLEXPRESS;Database=Management;Integrated Security=True;");
            }
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Employee>(entity =>
            {
                entity.Property(e => e.Designation)
                    .HasMaxLength(100)
                    .IsUnicode(false);

                entity.Property(e => e.Email)
                    .HasMaxLength(20)
                    .IsUnicode(false);

                entity.Property(e => e.Location)
                    .IsRequired()
                    .HasMaxLength(50)
                    .IsUnicode(false);

                entity.Property(e => e.Name)
                    .IsRequired()
                    .HasMaxLength(100)
                    .IsUnicode(false);
            });

            OnModelCreatingPartial(modelBuilder);
        }

        partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
    }
}

amespace Clean.Server.Api
{
    public partial class Employee
    {
        public long EmployeeId { get; set; }
        public string Name { get; set; }
        public string Designation { get; set; }
        public string Email { get; set; }
        public string Location { get; set; }
        public long PhoneNumber { get; set; }
    }
}

namespace Clean.Server.Api
{
    public interface IEmployeAccessLayer
    {
        IEnumerable<Employee> GetAllEmployees();
        void AddEmployee(Employee employee);
        void UpdateEmployee(Employee employee);
        Employee GetEmployeeData(long id);
        void DeleteEmployee(long id);
    }

    public class EmployeAccessLayer : IEmployeAccessLayer
    {
        private ManagementContext _context;
        public EmployeAccessLayer(ManagementContext context)
        {
            _context = context;
        }

        //To Get all employees details   
        public IEnumerable<Employee> GetAllEmployees()
        {
            try
            {
                return _context.Employee.ToList();
            }
            catch(Exception ex)
            {
                throw;
            }
        }

        //To Add new employee record     
        public void AddEmployee(Employee employee)
        {
            try
            {
                _context.Employee.Add(employee);
                _context.SaveChanges();
            }
            catch
            {
                throw;
            }
        }

        //To Update the records of a particluar employee    
        public void UpdateEmployee(Employee employee)
        {
            try
            {
                _context.Entry(employee).State = EntityState.Modified;
                _context.SaveChanges();
            }
            catch
            {
                throw;
            }
        }

        //Get the details of a particular employee    
        public Employee GetEmployeeData(long id)
        {
            try
            {
                Employee employee = _context.Employee.Find(id);
                return employee;
            }
            catch
            {
                throw;
            }
        }

        //To Delete the record of a particular employee    
        public void DeleteEmployee(long id)
        {
            try
            {
                Employee emp = _context.Employee.Find(id);
                _context.Employee.Remove(emp);
                _context.SaveChanges();
            }
            catch
            {
                throw;
            }
        }
    }
}

namespace Clean.Server.Controllers
{
    public class EmployeeController : ControllerBase
    {
        IEmployeAccessLayer _employee;

        public EmployeeController(IEmployeAccessLayer employee)
        {
            _employee = employee;
        }

        [HttpGet]
        [Route("api/Employee/Index")]
        public IEnumerable<Employee> Index()
        {
            return _employee.GetAllEmployees();
        }

        [HttpPost]
        [Route("api/Employee/Create")]
        public void Create([FromBody] Employee employee)
        {
            if (ModelState.IsValid)
                this._employee.AddEmployee(employee);
        }

        [HttpGet]
        [Route("api/Employee/Details/{id}")]
        public Employee Details(int id)
        {
            return _employee.GetEmployeeData(id);
        }

        [HttpPut]
        [Route("api/Employee/Edit")]
        public void Edit([FromBody]Employee employee)
        {
            if (ModelState.IsValid)
                this._employee.UpdateEmployee(employee);
        }

        [HttpDelete]
        [Route("api/Employee/Delete/{id}")]
        public void Delete(int id)
        {
            _employee.DeleteEmployee(id);
        }
    }
}

更完整的错误消息是:

不支持提供的ContentType;支持的类型为“ application / json”,结构化后缀为“ application / + json”

要将实体对象转换为Json,我尝试将JsonSerializer.Serialize()应用于GetAllEmployees中的EmployeeAccessLayer.cs方法。结果是:

无法将类型字符串隐式转换为System.Collections.Generic.IEnumerable

我最终可能会找到解决方法。

return JsonSerializer.Serialize(_context.Employee.ToList());

EmployeeAccessLayer.cs中进行序列化是否是进行此转换的正确思路和适当位置?

如果是的话,如何将其转换为正确的类型?

或者EF中是否有可以为我做的设置?

1 个答案:

答案 0 :(得分:-1)

在Startup.cs中,我需要注册我做过的ManagementContext和IemployeAccessLayer:

public static string Connection { get; set; }
            Connection = Configuration.GetConnectionString("EmployeeDatabase");
            services.AddDbContext<ManagementContext>(options => options.UseSqlServer(Connection));
            services.AddScoped<IEmployeAccessLayer, EmployeAccessLayer>();

,在ManagementContext.cs中,我更改了OnConfiguring:

optionsBuilder.UseSqlServer(Clean.Server.Startup.Connection);

在剃刀文件中似乎可以运行(最低测试)的json命令是: GetFromJsonAsync, PutAsJsonAsync, DeleteAsync, PostAsJsonAsync