【问题标题】:dbset.Remove(entity) not working Got Error at this linedbset.Remove(entity) not working 在这一行出现错误
【发布时间】:2015-09-29 18:38:06
【问题描述】:

我的删除功能不起作用。

   public virtual void Delete(T entity)
   {
      dbset.Remove(entity);
   }

我首先实现了工作模式和存储库模式以及实体框架代码。我有代码优先实体层、服务层、数据上下文层和 UI 层。我的编辑、更新、添加功能工作正常。但我的删除功能不工作。

我收到此错误。 EntityFramework.dll 中出现“System.ArgumentNullException”类型的异常,但未在用户代码中处理。

附加信息:值不能为空“值不能为空。参数名称:实体”

在我的项目控制器中。我的代码是这样的----

  public class ProjectController : Controller
   {
      private readonly IProjectService _projectService;
      public ProjectController(IProjectService projectService)
   {
      this._projectService = projectService;
   }

    [HttpGet]
    public ActionResult Delete(int? id)
    {
        var projectDetails = _projectService.GetProjectById((int)id);
        if (projectDetails == null) throw new ArgumentNullException("Not Found");
        return View(projectDetails);
    }
    [HttpPost]
    public ActionResult Delete(Project project)
    {
        _projectService.DeleteProject(project.ProjectId);
        return RedirectToAction("List","Project");
    }

在我的服务层中,我的控制器实现了所有逻辑----

    public class ProjectService : IProjectService
      {
        private readonly IProjectRepository _projectRepository;
        private readonly IUnitOfWork _unitOfWork;
        public ProjectService(IProjectRepository           projectRepository,IUnitOfWork unitOfWork)                  
      {
       this._projectRepository = projectRepository;
       this._unitOfWork = unitOfWork;
   }

   public void DeleteProject(int id)
      {
       var project = _projectRepository.GetById(id);
       _projectRepository.Delete(project);
       _unitOfWork.Commit();
      }

我的实体存储库基类包含的方法是--------

   public abstract class EntityRepositoryBase<T> where T : class
     {
        private CodeFirstContext _dataContext;
        private readonly IDbSet<T> dbset;
        protected EntityRepositoryBase(IDBFactory databaseFactory)
    {
        DatabaseFactory = databaseFactory;
        dbset = DataContext.Set<T>();
    }

    protected IDBFactory DatabaseFactory
    {
        get;
        private set;
    }

    protected CodeFirstContext DataContext
    {
        get { return _dataContext ?? (_dataContext = DatabaseFactory.Get()); }
    }

    public virtual void Delete(T entity)
    {
        dbset.Remove(entity);
    }

    public void Delete(Func<T, Boolean> where)
    {
        IEnumerable<T> objects = dbset.Where<T>(where).AsEnumerable();
        foreach (T obj in objects)
        dbset.Remove(obj);
    }

在我的 IEntityRepository 类中,方法是-----

  public interface IEntityRepository<T> where T : class
    {
       void Delete(T entity);
       void Delete(Func<T, Boolean> predicate);
     }

我的 Delete.cshtml 文件是这样的----

    @model CodeFirstEntities.Models.Project

   @{
      ViewBag.Title = "Delete";
    }

   <h2>Delete</h2>

   <h3>Are you sure you want to delete this?</h3>
   <fieldset>
<legend>Project</legend> 
@Html.HiddenFor(model => model.ProjectId)
@Html.HiddenFor(model => model.ProjectName)
@Html.HiddenFor(model => model.DeveloperName)
@Html.HiddenFor(model => model.Address)
@Html.HiddenFor(model => model.Website)
@Html.HiddenFor(model => model.Geolongitude)
@Html.HiddenFor(model => model.Geolatitude)

<div class="display-label">
     @Html.DisplayNameFor(model => model.ProjectName)
</div>
<div class="display-field">
    @Html.DisplayFor(model => model.ProjectName)
</div>

<div class="display-label">
     @Html.DisplayNameFor(model => model.DeveloperName)
</div>
<div class="display-field">
    @Html.DisplayFor(model => model.DeveloperName)
</div>

<div class="display-label">
     @Html.DisplayNameFor(model => model.Address)
</div>
<div class="display-field">
    @Html.DisplayFor(model => model.Address)
</div>

<div class="display-label">
     @Html.DisplayNameFor(model => model.Website)
</div>
<div class="display-field">
    @Html.DisplayFor(model => model.Website)
</div>

<div class="display-label">
     @Html.DisplayNameFor(model => model.Geolongitude)
</div>
<div class="display-field">
    @Html.DisplayFor(model => model.Geolongitude)
</div>

<div class="display-label">
     @Html.DisplayNameFor(model => model.Geolatitude)
</div>
<div class="display-field">
    @Html.DisplayFor(model => model.Geolatitude)
  </div>
    </fieldset>
     @using (Html.BeginForm()) {
     @Html.AntiForgeryToken()
     <p>
     <input type="submit" value="Delete" /> |
     @Html.ActionLink("List", "Project")
     </p>
       }

【问题讨论】:

  • 你检查过这里“var project = _projectRepository.GetById(id);”真的不为空吗?

标签: c# entity-framework model-view-controller


【解决方案1】:

通过查看您的表单的标记,我没有看到指定项目信息的地方。相反,项目信息是在您的表单之外指定的。因此,如果您进行以下更改,那么您将能够在按下 Delete 按钮时将项目信息发送到服务器。

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    <p>
        @Html.HiddenFor(model => model.ProjectId)
        @Html.HiddenFor(model => model.ProjectName)
        @Html.HiddenFor(model => model.DeveloperName)
        @Html.HiddenFor(model => model.Address)
        @Html.HiddenFor(model => model.Website)
        @Html.HiddenFor(model => model.Geolongitude)
        @Html.HiddenFor(model => model.Geolatitude)

        <input type="submit" value="Delete" /> |
        @Html.ActionLink("List", "Project")
    </p>
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2017-07-08
    相关资源
    最近更新 更多