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);
}

生成数据结构:

301131458421030.png

测试数据代码:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值