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



本文转自田园里的蟋蟀博客园博客,原文链接:http://www.cnblogs.com/xishuai/p/4377549.html,如需转载请自行联系原作者

相关文章
|
11月前
|
关系型数据库 索引
DB2查询主键、索引、表约束
DB2查询主键、索引、表约束
767 0
|
5月前
|
存储 关系型数据库 MySQL
在MySQL中, 自增主键和UUID作为主键有什么区别?
自增主键和UUID在MySQL中各有优缺点,选择哪种方式作为主键取决于具体的应用场景和需求。例如,在需要高性能插入和查询的场景下,自增主键可能更合适;而在需要保证主键全局唯一性和不可预测性的场景下,UUID可能更合适。
57 0
|
5月前
|
存储 关系型数据库 MySQL
MySQL中, 自增主键和UUID作为主键有什么区别?
MySQL中, 自增主键和UUID作为主键有什么区别?
77 0
|
5月前
|
SQL Oracle 关系型数据库
SQL PRIMARY KEY 约束- 唯一标识表中记录的关键约束
SQL NOT NULL 约束用于强制确保列不接受 NULL 值。这意味着该字段始终包含一个值,而不允许插入新记录或更新记录时不提供此字段的值。
123 0
|
SQL 关系型数据库 MySQL
列的完整性约束——设置表字段的外键约束(FOREIGN KEY,FK)
列的完整性约束——设置表字段的外键约束(FOREIGN KEY,FK)
|
存储 SQL 数据可视化
约束,MySQL约束,非空默认值,主键外键唯一自增,完整详细可收藏
约束,MySQL约束,非空默认值,主键外键唯一自增,完整详细可收藏
533 2
约束,MySQL约束,非空默认值,主键外键唯一自增,完整详细可收藏
|
SQL 关系型数据库 MySQL
mysql ,如何将B表的字段f 作为A表的主键s的外键?
假设您已经有两个表A和B,且它们都已经有字段,其中A表的主键为s,B表中的字段为f。要将B表的字段f作为A表的主键s的外键,可以使用以下的 SQL 语句来实现:
基于Saas主键表生成主键id
首先需要对当前的id进行拦截操作,也即使用aop的切面Aspect对切点进行拦截,在进行新增的时候进行拦截: 也就是说在进行主键的生成时,我们拦截好需要生成的主键,此时就可以对其进行新增操作了,而首要的就是拿到它的primaryKey。由于进行新增操作,通常分为两种情况: 通过字节码拿到声明的方法getId,如果此时存在id,则说明此时的操作是更新操作,因此直接返回。如果当前通过字节码拿到的声明方法getTenant,通过租户方法拿到租户id。拿到租户id后,就可以进行主键id获取了。
164 0
基于Saas主键表生成主键id
|
关系型数据库 MySQL 索引
MySQL约束——添加主键约束(联合主键)、删除主键约束
MySQL约束——添加主键约束(联合主键)、删除主键约束
1835 0
|
SQL Oracle 关系型数据库
oracle中查看一张表是否有主键,主键在哪个字段上
oracle中查看一张表是否有主键,主键在哪个字段上