需要插入子集的时候如何更新父级ID
场景模拟:
我们需要在不同的新闻站点中采集新闻信息, 所以需要在数据库中保存一个新闻站点表(Site) 一个新闻表(News) 两表之间的关系是 Site(1)-News(N)
数据库关系
实例:
程序运行后我们首先会加载新闻站点列表和采集规则,比如准备开始采集”新浪-国内新闻”板块的时候,解析出的所有新闻都保存在数据库中,在新闻表 Site_Id的值是新浪保存在News中的主键。
关联问题可参阅http://bbs.csdn.net/topics/391036710?page=1
解析:
如果我们采用原生sql来写的话,可能就是读取出Site的主键(此时早已读取出来保存在内存中 ),然后结合准备添加的News实体构造insert语句即可,不过EF的使用原则应该是:
子集的添加应该是添加到父集中的导航属性(ICollection<T>)
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{ public class Site
{
[Key]
public int Id{ get; set; }
public string Name { get; set; } /*virtual 知识点关键字:EF三种关联加载 Lazy Loading,Eager Loading,Explicit Loading*/
public virtual ICollection<News> Newss { get; set; }
} public class News
{
[Key]
public int Id { get; set; } public string title { get; set; }
public string content { get; set; } public virtual Site Site { get; set; }
}
public class MyTestContent : DbContext
{
public MyTestContent( )
{
Database.SetInitializer<MyTestContent>(null);
}
public DbSet<Site> Site { get; set; }
public DbSet<News> News{ get; set; }
} static void saveSiteDemo( )
{
using (var db = new MyTestContent())
{
db.Site.Add(new Site
{
Name = "新浪"
}); db.SaveChanges();
}
} static void saveSiteDemo( string siteName )
{
//首先读取站点实体
using (var db = new MyTestContent())
{
Site site = db.Site.FirstOrDefault(one => one.Name == siteName); /*图1:站点下还没有新闻的时候容器为null 所以我们需要new一个出来*/
if (site.Newss == null)
{
site.Newss = new List<News>();
} /*将需要添加的子集 添加到父集的导航属性中*/
site.Newss.Add(new News
{
title = "新闻标题",
content = "新闻内容"
}); /*保存数据库 子集保存完成*/
db.SaveChanges(); /*图2:现在来读取子集看看有没有值*/
News news = db.News.FirstOrDefault();
/*图3:再来读取父集看看 读取出来的结果与图1有和不同*/
Site newSite = db.Site.FirstOrDefault();
}
} static void Main( string[] args )
{
saveSiteDemo();
saveSiteDemo("新浪");
}
需要插入子集的时候如何更新父级ID的更多相关文章
- sql实现通过父级id查询所有的子集
通过sql实现传入父级id查询出所有的子集 最近刚好有个业务需要这样实现个功能,就是在点击查询列表详情的时候只会传入父级id,而详情得渲染出所有子集,那么做法有很多,可以直接通过代码递归查询去实现, ...
- 通过父级id获取到其下所有子级(无穷级)——Mysql函数实现
[需求]某用户只能查看其自己信息及其下级信息,涉及通过该用户所在部门获取其下所有部门(多层)id集合. 步骤一:对数据库进行设置: set global log_bin_trust_function_ ...
- [经典SQL语句]根据父级ID查找所有子级ID,并将所有ID用逗号隔开返回
树形表结构: id parentID isDel 1 0 0 2 1 0 3 1 1 4 2 0 5 2 0 一)根据父级ID查找所有子级ID,并将所有ID用逗号隔开返回 ID=,需要返回的结果(条件 ...
- MySQL通过自定义函数实现递归查询父级ID或者子级ID
背 景: 在MySQL中如果是有限的层次,比如我们事先如果可以确定这个树的最大深度, 那么所有节点为根的树的深度均不会超过树的最大深度,则我们可以直接通过left join来实现. 但很多时候我们是无 ...
- PHP 根据子ID递归获取父级ID,实现逐级分类导航效果
代码: //当前路径 $cate=M('wangpan_class')->select(); function get_top_parentid($cate,$id){ $arr=array() ...
- 使用Oracle数据库实现树形结构表的子-父级递归查询和删除,通过级联菜单简单举例
前言: 我们在开发中,常常遇到单表的子-父id级联的表结构,在树形的深度不确定的情况下,一次查询出某个树形结构下的所有具有子-父级关系的数据变得十分困难. 这时,我们使用oracle提供的CONNEC ...
- 使用postgre数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例
前言:开发常用的关系型数据库MySQL,mssql,postgre,Oracle,简单的增删改查的SQL语句都与标准SQL兼容,这个不用讲,那么对于迭代查询(不严格的叫法:递归查询)每种数据库都不一样 ...
- java List递归排序,传统方式和java8 Stream优化递归,无序的列表按照父级关系进行排序(两种排序类型)
当有一个List列表是无序的,List中的数据有parentid进行关联,通过java排序成两种排序类型: 所用的测试列表最顶级无parentid,若为特殊值,修改下判断方法即可. 第一种排序:按照树 ...
- sql 语句查所有父级
常见问题,给一个记录ID,查出它的所有父级,直到顶级 使用SMSS,sql server,找到一个办法. 思路是分两步,先循环找到所有父级的ID,再用IN查出所有父级 列说明 ID=PK Pare ...
随机推荐
- 基于anyrtc的sdk实现直播连麦互动
基于anyrtc的sdk实现直播连麦互动 前言 1.由于粘贴了较大的代码,造成内容比较长,可能会花费您较长的时间. 2.项目里面没有做权限判断,所以如果发现有页面发生崩溃可能是权限没有打开,请打开权限 ...
- Redis操作字符串工具类封装,Redis工具类封装
Redis操作字符串工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>>& ...
- SQL Developer 4.1.3
http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html SQL DeveloperDo ...
- Chrome资源加载被Cancel的问题
好个表久没写文章了. 做为一个砖业的砖工只能天天搬砖做些没有营养没有技术难度的活儿. 最近折腾个网站.发现一个很奇怪的问题- 各种图片的请求被取消了状态为Canceled. 顿时Chrome变成一个更 ...
- android.util.AndroidRuntimeException: requestFeature() must be called before adding content解决办法
最近在学习第一行代码这本书,里面的关于activity生命周期有一段例子,但是我自己用mac上装的as运行一直出问题,看log的话就是android.util.AndroidRuntimeExcept ...
- android中使用Intent在activity之间传递数据
android中intent传递数据的简单使用: 1.使用intent传递数据: 首先将需要传递的数据放入到intent中 Intent intent = new Intent(MainActivit ...
- CodeFirst 的编程方式
第一步:创建控制台项目第二步:添加新建项目→Ado.Net空实体模型第三步:添加实体:Customer,添加几个必要的测试字段第四步:添加实体之间的联系第五步:根据模型生成数据库脚本,并执行sql脚本 ...
- 【实习记】2014-09-04浏览代码查middle资料+总结我折腾过的源码浏览器
浏览着代码,看源码可以先看make文件,make文件有制造的流程信息. 一般可以从运行的程序对应的cpp看起.然而如果有框架,那就不容易了,会关系错纵复杂. 总结一下我折腾过的源码阅读器. s ...
- 《sed的流艺术之三》-linux命令五分钟系列之二十三
本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...
- 规则引擎-BRMS在企业开发中的应用
1. 什么是规则复杂企业级项目的开发以及其中随外部条件不断变化的业务规则(business logic),迫切需要分离商业决策者的商业决策逻辑和应用开发者的技术决策,并把这些商业决策放在中心数据库或其 ...