zoukankan      html  css  js  c++  java
  • EF Code First 主键对应多个外键

    这是一位朋友提出的疑问,EF 映射主键可以对应多个外键吗?如果外键设置级联删除会发生什么情况?下面做一个测试,示例实体代码:

    public class Blog
    {
        public Blog()
        {
            Post1s = new List<Post1>();
            Post2s = new List<Post2>();
        }
        public int Id { get; set; }
        public string Title { get; set; }
        public string Url { get; set; }
        public string Remark { get; set; }
        public virtual List<Post1> Post1s { get; set; }
        public virtual List<Post2> Post2s { get; set; }
    }
    
    public class Post1
    {
        public int Id { get; set; }
        public int BlogId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }
        public virtual Blog Blog { get; set; }
    }
    public class Post2
    {
        public int Id { get; set; }
        public int BlogId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }
        public virtual Blog Blog { get; set; }
    }
    

    Blog 作为主表,Post1 和 Post2 作为字表,对应关系是一对多,示例映射代码:

    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post1> Post1s { get; set; }
    public DbSet<Post2> Post2s { get; set; }
    
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    	modelBuilder.Entity<Blog>()
    		.HasKey(t => t.Id);
    
    	modelBuilder.Entity<Blog>()
    		.HasMany(t => t.Post1s)
    		.WithRequired()
    		.HasForeignKey(t => t.BlogId)
    		.WillCascadeOnDelete(true);
    
    	modelBuilder.Entity<Blog>()
    		.HasMany(t => t.Post2s)
    		.WithRequired()
    		.HasForeignKey(t => t.BlogId)
    		.WillCascadeOnDelete(true);
    
    	modelBuilder.Entity<Post1>()
    		.HasKey(t => t.Id);
    	modelBuilder.Entity<Post2>()
    		.HasKey(t => t.Id);
    
    	base.OnModelCreating(modelBuilder);
    }
    

    生成数据结构:

    测试数据代码:

    static void Main(string[] args)
    {
        using (var context=new BloggingContext())
        {
            //var blog = new Blog
            //{
            //    Remark = "1",
            //    Title = "1",
            //    Url = "1"
            //};
            //blog.Post1s.Add(new Post1
            //{
            //    Title = "1",
            //    Blog = blog,
            //    Content = "1"
            //});
            //blog.Post2s.Add(new Post2
            //{
            //    Title = "1",
            //    Blog = blog,
            //    Content = "1"
            //});
            //context.Blogs.Add(blog);
            var blog = context.Blogs.FirstOrDefault();
            context.Blogs.Remove(blog);
            context.SaveChanges();
            Console.ReadKey();
        }
    }
    

    测试结果我就不截图了,上面映射配置中,Blog 和 Post1、Post2 关系是一对多,并且级联删除,当我们添加 Blog 中的数据,Post1、Post2 也会自动生成对应的外键值,当我们删除 Blog 中的数据,外键对应 Post1、Post2 中的数据也会自动删除。

    总的来说,EF Code First 主键对应多个外键?答案是:没什么问题。

  • 相关阅读:
    HDU Railroad (记忆化)
    HDU 1227 Fast Food
    HDU 3008 Warcraft
    asp vbscript 检测客户端浏览器和操作系统(也可以易于升级到ASP.NET)
    Csharp 讀取大文本文件數據到DataTable中,大批量插入到數據庫中
    csharp 在万年历中计算显示农历日子出错
    csharp create ICS file extension
    CSS DIV Shadow
    DataTable search keyword
    User select fontface/color/size/backgroundColor设置 字体,颜色,大小,背景色兼容主流浏览器
  • 原文地址:https://www.cnblogs.com/xishuai/p/4377549.html
Copyright © 2011-2022 走看看