C# 为实体框架查询使用单独的类文件(模型),而不是在控制器本身中编写
可以在models文件夹中的单独类文件中写入EF查询,而不是将其写入控制器本身 因为我在msdn中看到所有EF查询都是在控制器本身中编写的。同时,我也在msdn中读过一次,控制器是短的 使用模型,我使用这种方法: 在控制器中:C# 为实体框架查询使用单独的类文件(模型),而不是在控制器本身中编写,c#,entity-framework,code-maintainability,C#,Entity Framework,Code Maintainability,可以在models文件夹中的单独类文件中写入EF查询,而不是将其写入控制器本身 因为我在msdn中看到所有EF查询都是在控制器本身中编写的。同时,我也在msdn中读过一次,控制器是短的 使用模型,我使用这种方法: 在控制器中: public JsonResult SaveStorageLocation(StorageLocations objStorageLocation) { int Result = 0; try
public JsonResult SaveStorageLocation(StorageLocations objStorageLocation)
{
int Result = 0;
try
{
StorageLocationModel objStorageLocationModel = new StorageLocationModel();
if (objStorageLocation.Id == Guid.Empty)
{
Result = objStorageLocationModel.AddStorageLocation(objStorageLocation, SessionUserId);
}
else
{
Result = objStorageLocationModel.UpdateStorageLocation(objStorageLocation, SessionUserId);
}
}
catch (Exception ex)
{
Result = (int)MethodStatus.Error;
}
return Json(Result, JsonRequestBehavior.AllowGet);
}
在模型类中:
public int AddStorageLocation(StorageLocations objStorageLocation, Guid CreatedBy)
{
MethodStatus Result = MethodStatus.None;
int DuplicateRecordCount = db.StorageLocations.Where(x => x.Location.Trim().ToLower() == objStorageLocation.Location.Trim().ToLower()).Count();
if (DuplicateRecordCount == 0)
{
objStorageLocation.Id = Guid.NewGuid();
objStorageLocation.CreatedBy = CreatedBy;
objStorageLocation.CreatedOn = DateTime.Now;
objStorageLocation.ModifiedBy = CreatedBy;
objStorageLocation.ModifiedOn = DateTime.Now;
objStorageLocation.Status = (int)RecordStatus.Active;
db.StorageLocations.Add(objStorageLocation);
db.SaveChanges();
Result = MethodStatus.Success;
}
else
{
Result = MethodStatus.MemberDuplicateFound;
}
return Convert.ToInt32(Result);
}
public int UpdateStorageLocation(StorageLocations objStorageLocationNewDetails, Guid ModifiedBy)
{
MethodStatus Result = MethodStatus.None;
int DuplicateRecordCount =
db.StorageLocations.
Where(x => x.Location == objStorageLocationNewDetails.Location &&
x.Id != objStorageLocationNewDetails.Id).Count();
if (DuplicateRecordCount == 0)
{
StorageLocations objStorageLocationExistingDetails = db.StorageLocations.Where(x => x.Id == objStorageLocationNewDetails.Id).FirstOrDefault();
if (objStorageLocationExistingDetails != null)
{
objStorageLocationExistingDetails.Location = objStorageLocationNewDetails.Location;
objStorageLocationExistingDetails.ModifiedBy = ModifiedBy;
objStorageLocationExistingDetails.ModifiedOn = DateTime.Now;
objStorageLocationExistingDetails.Status = (int)RecordStatus.Active;
db.SaveChanges();
Result = MethodStatus.Success;
}
}
else
{
Result = MethodStatus.MemberDuplicateFound;
}
return Convert.ToInt32(Result);
}
还是最好将所有代码都写在控制器本身中?我希望您的问题很快就会解决,因为它将被视为基于意见的问题 除此之外,如果您的控制器中没有查询,则有许多优点
- 控制器不应该指定如何访问数据,这是模型的工作
- 如果将模型(或服务或存储库,无论您想将其称为应用程序)作为依赖项注入,那么模拟数据访问就容易多了
- 稍后您可能会发现,如果将某些查询迁移到存储过程中,会更好地处理它们,因为它们处理大量数据。如果控制器不直接访问数据存储,则更容易进行此更改。您可以在模型类中进行更改并保持相同的接口,也可以编写一个新的实现,然后注入该实现
- 控制器和模型可以更容易地相互隔离测试
- 控制器不应该指定如何访问数据,这是模型的工作
- 如果将模型(或服务或存储库,无论您想将其称为应用程序)作为依赖项注入,那么模拟数据访问就容易多了
- 稍后您可能会发现,如果将某些查询迁移到存储过程中,会更好地处理它们,因为它们处理大量数据。如果控制器不直接访问数据存储,则更容易进行此更改。您可以在模型类中进行更改并保持相同的接口,也可以编写一个新的实现,然后注入该实现
- 控制器和模型可以更容易地相互隔离测试
- 您希望您的代码始终是可测试的
永远不要把逻辑放在模型中,把逻辑项放在模型文件夹中会使你的结构变脏,而且更容易丢失概述
您应该使用实现接口的存储库类。在repository类中,您可以执行EF逻辑、捕获数据库异常等
您的控制器将被注入存储库接口。通过这种方式,您可以独立于EF逻辑测试控制器,因为您可以模拟该接口。您的存储库也可以测试其oen功能 您希望您的代码始终是可测试的 永远不要把逻辑放在模型中,把逻辑项放在模型文件夹中会使你的结构变脏,而且更容易丢失概述 您应该使用实现接口的存储库类。在repository类中,您可以执行EF逻辑、捕获数据库异常等 您的控制器将被注入存储库接口。通过这种方式,您可以独立于EF逻辑测试控制器,因为您可以模拟该接口。您的存储库也可以测试其oen功能