zoukankan      html  css  js  c++  java
  • Entity Framework Core系列教程-14-Fluent API 配置一对一关系

    Entity Framework Core Fluent API 配置一对一关系

    在这里,您将学习如何使用Fluent API配置两个实体之间的一对一关系(如果它们不遵循EF Core约定)。
    通常,您不需要手动配置一对一关系,因为EF Core包含一对一关系的约定。但是,如果键或外键属性不遵循约定,则可以使用数据注释属性或Fluent API在两个实体之间配置一对一关系。
    让我们在以下不遵循外键约定的Student和StudentAddress实体之间配置一对一关系。

    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
           
        public StudentAddress Address { get; set; }
    }
    
    public class StudentAddress
    {
        public int StudentAddressId { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string Country { get; set; }
    
        public int AddressOfStudentId { get; set; }
        public Student Student { get; set; }
    }
    

    要在EF Core中使用Fluent API配置一对一关系,请使用HasOne,WithOne和HasForeignKey方法,如下所示:

    public class SchoolContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("Server=.\SQLEXPRESS;Database=EFCore-SchoolDB;Trusted_Connection=True");
        }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Student>()
                .HasOne<StudentAddress>(s => s.Address)
                .WithOne(ad => ad.Student)
                .HasForeignKey<StudentAddress>(ad => ad.AddressOfStudentId);
        }
    
        public DbSet<Student> Students { get; set; }
        public DbSet<StudentAddress> StudentAddresses { get; set; }
    }
    

    在上面的示例中,以下代码片段配置了一对一关系:

    modelBuilder.Entity<Student>()
        .HasOne<StudentAddress>(s => s.Address)
        .WithOne(ad => ad.Student)
        .HasForeignKey<StudentAddress>(ad => ad.AddressOfStudentId);
    

    让我们逐步分析代码:
    modelBuilder.Entity<Student>()开始配置Student实体。
    .HasOne<StudentAddress>(s => s.Address) 方法使用lambda表达式指定Student实体包括一个StudentAddress引用属性。
    .WithOne(ad => ad.Student) 配置关系的另一端,StudentAddress实体。它指定StudentAddress实体包括Student类型的参考导航属性。
    .HasForeignKey<StudentAddress>(ad => ad.AddressOfStudentId)指定外键属性名称。
    现在,要将其反映在数据库中,请执行迁移命令,add-migration <名称>和update-database。该数据库将包括两个具有一对一关系的表,如下所示。
    在这里插入图片描述
    下图说明了一对一关系的Fluent API配置:
    在这里插入图片描述
    您可以按照以下相同的方式开始使用StudentAddress实体进行配置。

    modelBuilder.Entity<StudentAddress>()
        .HasOne<Student>(ad => ad.Student)
        .WithOne(s => s.Address)
        .HasForeignKey<StudentAddress>(ad => ad.AddressOfStudentId);
    

    因此,您可以在Entity Framework Core中配置一对一关系。

  • 相关阅读:
    动态代理练习2全站压缩流输出[response动态代理]
    动态代理练习3自定义数据库连接池[connection动态代理]
    类加载器
    Mysql中的数据类型对应于Java中什么数据类型
    使用网上流传的一个数据库连接池在Proxy.newProxyInstance处引起 java.lang.ClassCastException 问题的解决方法
    动态代理练习1全站字符编码过滤[request动态代理]
    用cocos2dx将helloworld实现出来了
    多线程的自动管理(线程池)
    互斥对象
    多线程的自动管理(定时器)
  • 原文地址:https://www.cnblogs.com/AlexanderZhao/p/12878810.html
Copyright © 2011-2022 走看看