首页 > 数据库 >Fluent API 配置实体和数据库之间的映射关系

Fluent API 配置实体和数据库之间的映射关系

时间:2024-05-20 15:22:51浏览次数:24  
标签:set 映射 get void 配置 Fluent API modelBuilder public

1. 配置主键

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasKey(b => b.BlogId); // 配置Blog实体的主键为BlogId
}

 

2. 配置属性和列

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Url)
        .HasColumnName("BlogUrl") // 配置Url属性映射到数据库中的BlogUrl列
        .HasMaxLength(200) // 设置列的最大长度为200
        .IsRequired(); // 设置该列在数据库中不允许为空
}

 

3. 配置一对多关系

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasMany(b => b.Posts) // 配置Blog有一个Posts集合属性
        .WithOne(p => p.Blog) // 配置Post有一个Blog导航属性
        .HasForeignKey(p => p.BlogId); // 配置外键为Post实体的BlogId属性
}

 

4. 配置多对多关系(通过联接实体)

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>()
        .HasMany(s => s.Courses)
        .WithMany(c => c.Students)
        .UsingEntity<Enrollment>(
            j => j
                .HasOne(e => e.Student)
                .WithMany(s => s.Enrollments)
                .HasForeignKey(e => e.StudentId),
            j => j
                .HasOne(e => e.Course)
                .WithMany(c => c.Enrollments)
                .HasForeignKey(e => e.CourseId),
            j =>
            {
                j.ToTable("StudentCourse"); // 设置联接表的名称
            });
}

 

public class Enrollment
{
    public int StudentId { get; set; }
    public Student Student { get; set; }

    public int CourseId { get; set; }
    public Course Course { get; set; }

    // 可以添加其他属性,比如成绩等
}

 

5. 配置索引

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasIndex(b => b.Url) // 为Url属性创建索引
        .IsUnique(); // 设置索引为唯一
}

 

6. 配置复合主键和索引

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<SomeEntity>()
        .HasKey(e => new { e.Key1, e.Key2 }); // 配置复合主键

    modelBuilder.Entity<SomeEntity>()
        .HasIndex(e => new { e.Key1, e.Key2 }) // 配置复合索引
        .IsUnique(); // 设置索引为唯一
}

 

7. 配置数据注解与Fluent API混合使用

你可以同时使用数据注解(Data Annotations)和Fluent API来配置实体。Fluent API提供了更多的灵活性和更精细的控制,而数据注解则提供了更简洁的配置方式。例如:

[Table("Blogs")] // 使用数据注解配置表名
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    // ... 其他属性 ...
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Url)
        .HasMaxLength(200); // 使用Fluent API配置Url属性的最大长度
    // ... 其他配置 ...
}

 

在实际开发中,你可以根据项目的具体需求和团队偏好选择使用数据注解还是Fluent API,或者两者混合使用。通常,对于简单的配置可以使用数据注解,而对于需要更精细控制的场景则使用Fluent API。

 

对于您提供的模型,如果您想使用 Fluent API 来配置 PrivilegeGroup 和 Privilege 之间的关系,您可以这样做:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System.Collections.Generic;

namespace Model
{
    public class PrivilegeGroup
    {
        public int Id { get; set; }
        public string GroupName { get; set; }
        public virtual List<Privilege> Privileges { get; set; }
    }

    public class Privilege
    {
        public int Id { get; set; }
        public int PrivilegeGroupId { get; set; }
        public string PrivilegeName { get; set; }
        public virtual PrivilegeGroup PrivilegeGroup { get; set; }
    }

    public class YourDbContext : DbContext
    {
        public DbSet<PrivilegeGroup> PrivilegeGroups { get; set; }
        public DbSet<Privilege> Privileges { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // 配置 PrivilegeGroup 实体
            modelBuilder.Entity<PrivilegeGroup>(ConfigurePrivilegeGroup);

            // 配置 Privilege 实体
            modelBuilder.Entity<Privilege>(ConfigurePrivilege);
        }

        private void ConfigurePrivilegeGroup(EntityTypeBuilder<PrivilegeGroup> builder)
        {
            // 配置主键
            builder.HasKey(pg => pg.Id);

            // 配置 GroupName 为唯一索引
            builder.HasIndex(pg => pg.GroupName).IsUnique();

            // 配置与 Privilege 之间的关系(一对多)
            builder.HasMany(pg => pg.Privileges)
                   .WithOne(p => p.PrivilegeGroup)
                   .HasForeignKey(p => p.PrivilegeGroupId);
        }

        private void ConfigurePrivilege(EntityTypeBuilder<Privilege> builder)
        {
            // 配置主键
            builder.HasKey(p => p.Id);

            // 配置外键
            builder.HasOne(p => p.PrivilegeGroup)
                   .WithMany(pg => pg.Privileges)
                   .HasForeignKey(p => p.PrivilegeGroupId);
        }
    }
}

 

在这个例子中,PrivilegeGroup 和 Privilege 之间的关系被配置为一对多关系。Privilege 实体包含一个名为 PrivilegeGroupId 的外键属性,该属性引用 PrivilegeGroup 实体的 Id 属性。

ConfigurePrivilegeGroup 和 ConfigurePrivilege 方法分别用于配置 PrivilegeGroup 和 Privilege 实体的映射关系。在 ConfigurePrivilegeGroup 方法中,我们使用 HasIndex 方法来配置 GroupName 为唯一索引,并使用 HasMany 和 WithOne 方法来配置一对多关系。在 ConfigurePrivilege 方法中,我们使用 HasOne 和 WithMany 方法来配置多对一关系,并指定外键属性。

通过这种方式,您可以完全通过 Fluent API 来配置实体和数据库之间的映射关系,而不是依赖数据注解。这提供了更多的灵活性和控制力,特别是在处理复杂的模型和数据库结构时。

标签:set,映射,get,void,配置,Fluent,API,modelBuilder,public
From: https://www.cnblogs.com/jianxiaoxiu/p/18202013

相关文章

  • C++身份证二要素实名认证api、实名认证接口
    在数字化时代背景下,个人信息安全成为了社会关注的焦点。为进一步加强网络空间的安全管理,提升服务效率,身份证实名认证接口的出现为各行业提供了更为安全、高效的身份验证解决方案。随着互联网+政务服务、金融科技、电子商务等领域的快速发展,实名认证需求日益增长。翔云身......
  • apisix~集成服务发现注册中心
    摘要当业务量发生变化时,需要对上游服务进行扩缩容,或者因服务器硬件故障需要更换服务器。如果网关是通过配置来维护上游服务信息,在微服务架构模式下,其带来的维护成本可想而知。再者因不能及时更新这些信息,也会对业务带来一定的影响,还有人为误操作带来的影响也不可忽视,所以网关非常......
  • 开源低代码框架 ReZero API 正式版本发布 ,界面操作直接生成API
    一、ReZero简介ReZero是一款.NET中间件:全网唯一界面操作就能生成API, 可以集成到任何.NET6+API项目,无破坏性,也可让非.NET用户使用exe文件免费开源:MIT最宽松协议,一直从事开源事业十年,一直坚持开源1.1纯ReZero开发适合.NetCore零基础用户,大大简化了.NetCore开发门......
  • API
    api合并tips和comfirm更新Fork仓库(API)#添加上游远程仓库gitremoteaddupstreamhttps://gitee.com/openharmony/interface_sdk-js.git#拉取新设置的上游代码库gitfetchupstream#合并上游代码库和本地分支gitmergeupstream/masterETSGitee强制同......
  • APIO2024 游记
    License:CCBY-NC-SA4.0Day0(2024.5.16)前往杭州。路上在脑子里DFS曾学过的OI知识,发现还没忘完但也差不多了。/fadDay499122177拿到胸牌。去找K8He和Jijidawang面基了。然后就被fAKe了经典面基事故:见面之后不知道该干啥……由于不知道该干啥,所以只好润......
  • APIO 2024 游记
    Day-npkusc被拒了,不得不中途回宁一次。pku,你会后悔的!Day-4thusc期间爆标了T1,作为已经1=的选手,Day2工程发挥失误也无所谓了。就像有些事情,试过就好了。但是爆标也觉得离谱,出题人也被沉默了,与此同时沉默的,还有一个考场上第一个做法就是dlogv的那个疑惑的我。Day1启程一切......
  • 基于webapi的websocket聊天室(四)
    上一篇实现了多聊天室。这一片要继续改进的是实现收发文件,以及图片显示。效果问题websocket本身就是二进制传输。文件刚好也是二进制存储的。文件本身的传输问题不太,但是需要传输文件元数据,比如文件名和扩展名之类的。这很必要,如果我们想知道怎么展示这个文件的话。比如这个......
  • APIO2024 游记
    5.15爽逃石门,下午两点到杭州,被教练通知自己打车到酒店,还和教练换到了同一家。四点钟去西湖玩,景色非常怡人,惠风和畅,令人心旷神怡。后来打车到印象城吃饭,大战抽象的BrickBro,遗憾告负。之后走回酒店,路上经过看到闪闪发光的学军高楼,这真的不是商场配置吗?在房间报复性抽机许久,伯牙绝......
  • 百度 Apollo 使用 bazel 编译 C++ Boost 依赖出现 undefined reference to `boost::pyth
    CSDN搬家失败,手动导出markdown后再导入博客园因为一些原因,楼主想在Apollo自动驾驶框架里使用Boost.python工具来用C++调用Python,从网上找了个例子想编译下试试。C++代码如下(boost.python/EmbeddingPython-PythonWiki):#include<boost/python.hpp>usingnamesp......
  • 如此丝滑的API设计,用起来真香
    分享是最有效的学习方式。博客:https://blog.ktdaddy.com/故事工位上,小猫一边撸着代码,一边吐槽着前人设计的接口。如下:“我艹,货架模型明明和商品SKU模型是一对多的关系,接口入参的时候偏偏要以最小粒度的SKU将重复入参进行平铺”。“一个接口居然做了多件事情,传入参数复杂......