这是我用来了解其工作原理的简单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中是否有可以为我做的设置?
答案 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