13、CodeFirsrt级联查询和删除

级联删除

使用CodeFirst创建的外键约束默认都开启了级联删除,如下图就是通过CodeFirst创建的数据库,而且孩子表里还有父亲表的主键作为外键。

但是,我们试着删除它父亲的时,发现能直接删除,如图

就是因为使用codefirst创建的数据表的外键默认都开启了级联删除,也就是删除一个,可以删除全部有关联的数据。
比如;刚刚明明只删除了它的父亲,但是查询出来它的孩子也删除了。如图

直接在数据库里创建数据表,如果创建外键,删除父亲表时,会删除不了,如下图:

如果想使用codefirst创建外键,却又不想开启级联删除,可以在创建外键时在后面接一个
WillCascadeOnDelete,这样就把当前表的当前外键的级联删除关闭了。

这样我们删除父亲时,发现就删除不掉了

Ef code first默认开启级联删除,从你删除的表,当做主表,把相关的数据全部删除。
一般为了防止误删数据,一般可能项目里有很多表格,而且表格与表格之间可能有互相引用,就是有关联,但是如果删了其中一条数据,可能就把全部表格里的数据删除了,
所以,一般都是把全局的级联删除给关了,这样每个表的外键的级联删除给关了,然后在需要的表里在外键里将级联删除开启即可,这样破坏性就比较低了。
如图:

这样这张表格就是有外键关联也能删除完全部了。


级联查询

如果要查询某个有关联的表,表里的主键是作为孩子的外键,那么查父亲表,也就是一对多关系中的’多‘那个表,就可以查出与之相关联的表的数据,因为本身在codefirst里创建一个表的外键时,被引用的表里就要存引用它的表的集合,所以和数据库一样,可以通过自己来查引用它的表。

比如:父母表的实体映射:

public class UserParent
{
    public int Id { get; set; }
    public string Father { get; set; }
    public virtual List<UserInfo> useres { get; set; }//存的是引用它的那个表的集合。
}

学生表:

public class UserInfo
{
    public int Id { get; set; }
    [StringLength(128) ,Required]
    public string  UserName { get; set; }
    public string  Number { get; set; }
    public int ParentId { get; set; }//用作外键的字段
    public virtual UserParent userParent { get; set; }//父母表的导航属性
}

查询方法直接按照查父亲对象的方法

public UserParent SelectUserParent(int id)
{
    ShopContext shopContext = new ShopContext();
    return shopContext.UserParent.Where(a => a.Id == id).FirstOrDefault();
}

控制器里调用并接收返回的对象,传给前台

UserParent userParent= userDAL.SelectUserParent(1);
return View(userParent);

前台照常解析即可

@using Model
    @model UserParent
    <div>
    <span> 父亲:@Model.Father</span>
    <br />
    <hr />
    <span>孩子:</span> <br />
    @{
    foreach (UserInfo item in Model.useres)
    {
        <div>@item.UserName</div><br />
    }
}
</div>

效果如图:只查父亲也能通过外键关系找到多个孩子

数据库里的信息

posted @ 2022-01-11 14:15  青仙  阅读(122)  评论(0编辑  收藏  举报