• 需要插入子集的时候如何更新父级ID


    场景模拟:

    我们需要在不同的新闻站点中采集新闻信息,  所以需要在数据库中保存一个新闻站点表(Site) 一个新闻表(News) 两表之间的关系是        Site(1)-News(N)

    数据库关系7048.tmp

    实例:

    程序运行后我们首先会加载新闻站点列表和采集规则,比如准备开始采集”新浪-国内新闻”板块的时候,解析出的所有新闻都保存在数据库中,在新闻表 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("新浪");
            }

    image

     image

    image

  • 相关阅读:
    HTML简介
    web服务器的原理
    静态网页和动态网页的区别
    HTTP协议相关原理
    C/S,B/S的应用的区别
    git撤销commit但未push的文件
    表单提交不刷新页面
    httpclient请求中文乱码问题
    web项目,@return@see@param等注解Maven install报错,不能识别
    Hive 基本操作
  • 原文地址:https://www.cnblogs.com/farcall/p/4851588.html
Copyright © 2020-2023  润新知