zoukankan      html  css  js  c++  java
  • 需要插入子集的时候如何更新父级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

  • 相关阅读:
    笔记35 跨重定向请求传递数
    判断邮箱的正则表达式
    按钮
    async await 的用法
    笔记34 Spring MVC的高级技术——处理multipart形式的数据
    Convert Sorted Array to Binary Search Tree
    Binary Tree Zigzag Level Order Traversal
    Unique Binary Search Trees,Unique Binary Search Trees II
    Validate Binary Search Tree
    Populating Next Right Pointers in Each Node,Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/farcall/p/4851588.html
Copyright © 2011-2022 走看看