• 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 主键对应多个外键?答案是:没什么问题。

  • 相关阅读:
    什么时候用resultMap,什么时候用resultType?
    Cannot create PoolableConnectionFactory解决思路
    去除list集合中重复项的几种方法-转载
    ORA-02298 定位问题
    命令行退出MySQL和登录MySQL
    CX4-480服务器数据恢复过程(服务器数据恢复通用方法)
    也谈腾讯云的静默损坏
    raid5阵列两块硬盘离线怎么解决
    服务器卷删除初检报告/数据恢复成功率分析
    服务器两块硬盘离线如何恢复数据
  • 原文地址:https://www.cnblogs.com/xishuai/p/4377549.html
Copyright © 2020-2023  润新知