0

奇怪的事情发生了。我有一个名为 Group 的表,它与名为 UserGroups 的表具有一对多的关系。

现在使用实体框架 .Remove 方法。我可以删除一个有用户的组,尽管当我尝试直接在数据库上执行类似的操作时,它会引发异常(该组有子记录!!!)知道发生了什么!!!。

Action 方法如下所示:-

[HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            try
            {
                var v = groupRepository.Find(id).Name;

                groupRepository.Delete(id);
                groupRepository.Save();
                return Json(new { IsSuccess = "True", id = id, description = v }, JsonRequestBehavior.AllowGet);
              //  return RedirectToAction("Index");
            }
            catch (NullReferenceException)
            {
                //ModelState.AddModelError(string.Empty, " The record might have been already deleted.Please refresh the page.");
                return Json(new { IsSuccess = "False" }, JsonRequestBehavior.AllowGet);

            }
return RedirectToAction("Delete", new { id = id});
        }

存储库方法是:-

public void Delete(int id)
        {
            var group = context.Groups.Find(id);
            context.Groups.Remove(group);
        }

public Group Find(int id)
        {

            return context.Groups.Where(c => c.GroupID == id).Include(a => a.UserGroups)
                .Include(a2 => a2.SecurityRoles).SingleOrDefault();
        } 

恐怕因为在 Find 方法上我正在检索 Group 及其两个导航属性,所以这意味着 .Delete 将首先删除这些导航,然后它将删除 Group 对象!!!!

编辑

我定义了两种方法;查找和查找全部:-

public Group Find(int id)
        {

            return context.Groups.Find(id) ;
        }
        public Group FindAll(int id)
        {

            return context.Groups.Where(c => c.GroupID == id).Include(a => a.UserGroups)
                .Include(a2 => a2.SecurityRoles).SingleOrDefault();
        }

那么还有其他建议吗??

4

1 回答 1

0

是的,它会的。

根据您使用的虚拟或外国 id 字段:

public virtual Category {get; set;}

或者

public Guid CategoryId {get;set:}

将更改数据库表字段属性中设置的内容Allow Null,检查表设计器查看。virtual 将其设置为 true ,Allow Null然后外键字段将其设置为 false Allow Null。如果将它们组合在一起,那么它仍将设置为 false。我建议您将它们组合在一起,因为这将允许您在无需再次从数据库中显式调用的情况下提取子实体。因此,为了确保您禁用Cascade On Delete,您需要使用?运算符将​​外键字段设置为 null。见下文:

所以,如果你这样做:

public virtual Category {get;set;}

它将设置在数据库表中Allow Null的字段上。Category_Id

如果你这样做:

public Guid CategoryId {get;set;}
public virtual Category Category {get;set;}

它将创建字段CategoryId而不是设置Allow Null

但如果你这样做:

public Guid? CategoryId {get;set;}
public virtual Category Category {get;set;}

它将创建字段CategoryId并设置Allow Null

我用Guid作主键字段,但这仍然适用于Int. 如果您想知道如何使用Guid(我个人觉得更好),请执行以下操作:

[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id {get;set;}
于 2013-07-11T10:32:09.787 回答