【发布时间】:2020-06-13 11:03:00
【问题描述】:
这是一个简单的 CRUD 应用程序,我用来学习它是如何工作的。我以前使用过实体框架,但对它的工作原理知之甚少。这个应用程序有一个带有一个表的数据库,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() 应用于 EmployeeAccessLayer.cs 中的 GetAllEmployees 方法。结果是:
无法将类型字符串隐式转换为 System.Collections.Generic.IEnumerable
我最终可能会弄清楚如何做到这一点。
return JsonSerializer.Serialize(_context.Employee.ToList());
EmployeeAccessLayer.cs 中的序列化是进行这种转换的正确想法和地点吗?
如果是这样,我如何将其转换为正确的类型?
或者 EF 中是否有适合我的设置?
【问题讨论】:
-
测试
"/api/Employee"端点。将完整的 URL 拖放到浏览器中。您可能有一个以 HTML 形式返回的服务器错误。见stackoverflow.com/q/62235662/60761。而且您不需要某个地方的 EmployeeId 吗? -
我花了很多时间试图找到如何接受这些编辑。从来没有找到ti。
-
昨天我做了一些更改,我猜一次太多了,并且破坏了应用程序,所以我设置了一个名为 Clean 的新应用程序。之后错误消息更改为:'System.Net.Http.HttpRequestException: Response status code does not指示success: 500'
-
我在 api 调用中尝试了使用和不使用斜杠,你说得对,因为它需要一个 EmployeeId。但是 "/api/Employee/Index") 仍然无法正常工作。
标签: c# entity-framework blazor webassembly