這是一位朋友提出的疑問,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 主鍵對應多個外鍵?答案是:沒什么問題。