关于EntityFramework 一对多 Fluent API配置的问题

1.背景

例子:目的地类(Desctination)与客栈(Lodging)的关系是1个目的地可以拥有多个客栈。那么关系就是1对多的关系

2.Code

    /// <summary>
    /// 旅游目的地
    /// </summary>
    public class DestinationContract
    {
        /// <summary>
        /// 目的地主键
        /// </summary>
        public long DestinationId { get; set; }

        /// <summary>
        /// 目的地名称
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 目的地所在的国家
        /// </summary>
        public string Country { get; set; }

        /// <summary>
        /// 目的地简介
        /// </summary>
        public string Description { get; set; }

        /// <summary>
        /// 宣传图片
        /// </summary>
        public byte[] Photo { get; set; }

        /// <summary>
        /// 目的地所有的客栈
        /// </summary>
        public List<LodgingContract> Lodgings { get; set; }
    }
    /// <summary>
    /// 目的地城市的客栈
    /// </summary>
    public class LodgingContract
    {
        /// <summary>
        /// 客栈的主键
        /// </summary>
        public long LodgingId { get; set; }

        /// <summary>
        /// 客栈所在目的地城市的主键
        /// </summary>
        public long LgDestinationId { get; set; }

        /// <summary>
        /// 客栈的名称
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 客栈的价位
        /// </summary>
        public decimal Price { get; set; }

        /// <summary>
        /// 客栈所在目的地
        /// </summary>
        public DestinationContract Destination { get; set; }
    }

3.如何进行配置

如何用Fluent API 进行关系配置,而不生成多余的数据库字段,只进行关系配置,在Lodging(多)的EntityTypeConfiguration<>里面写如下的代码

   HasRequired(l => l.Destination).WithMany().HasForeignKey(l => l.LgDestinationId);

这样虽然程序能够正常运行,但是数据库仍然会生成多余的字段,如下图:

这样显然虽然能够在Lodging表的外键LgDestinationId插入想要的外键,但是会自动生成DestinationContract_DestinationId这个字段,显然不是我们的预期效果。

4.改进

经过不断的尝试,我们需要在Destination的EntityTypeConfiguration的配置类进行下面的配置:

     HasMany(d => d.Lodgings).WithRequired(l => l.Destination).HasForeignKey(t => t.LgDestinationId);//此写法正确,没有生成多余的字段

运行效果的如下:

5.关于CodeFirst Fluent API的关系配置的基础知识

表与表之间的关系有三种:

1.Optional(一个属性可拥有一个单个实例或没有)对应的方法:HasOptional

2.Required(一个属性必须拥有一个单个实例)对应的方法:HasRequired

3.Many(一个属性可以拥有单个类型的集合)对应的方法:HasMany

多数情况下,还需要在Has方法后面加上with方法。WithOptional、WithRequired、WithMany

先这样吧,时间不早了,各位晚安了,如果对你有帮助,麻烦点个赞吧。

时间: 2024-08-08 17:43:14

关于EntityFramework 一对多 Fluent API配置的问题的相关文章

使用Fluent API 配置/映射属性和类型

Code First约定-Fluent API配置 使用Fluent API 配置/映射属性和类型 简介 通常通过重写派生DbContext 上的OnModelCreating 方法来访问Code First Fluent API.以下示例旨在显示如何使用 Fluent API 执行各种任务,您可以将代码复制出来并进行自定义,使之适用于您的模型. 属性映射 使用Fluent API 配置/映射属性和类型 简介 通常通过重写派生DbContext 上的OnModelCreating 方法来访问Co

Code First约定-Fluent API配置

转自:http://blog.163.com/m13864039250_1/blog/static/2138652482015283397609/ 用Fluent API 配置/映射属性和类型 简介 通常通过重写派生DbContext 上的OnModelCreating 方法来访问Code First Fluent API.以下示例旨在显示如何使用 Fluent API 执行各种任务,您可以将代码复制出来并进行自定义,使之适用于您的模型. 属性映射 Property 方法用于为每个属于实体或复杂

Entity Framework Code First (五)Fluent API - 配置关系

上一篇文章我们讲解了如何用 Fluent API 来配置/映射属性和类型,本文将把重点放在其是如何配置关系的. 文中所使用代码如下 public class Student { public int ID { get; set; } public string Name { get; set; } public DateTime EnrollmentDate { get; set; } // Navigation properties public virtual Address Address

Fluent API 配置

EF里实体关系配置的方法,有两种: Data Annotation方式配置 也可以 Fluent API 方式配置 Fluent API 配置的方法 EF里的实体关系 Fluent API 配置分为Has和With系列的方法: Optional 可选的 Required 必须的 Many 多个 [举例]: A.HasRequired(a => a.B).WithOptional(b => b.A); 这里的a=>a.B是lambda表示写法,就是找到A类里的导航属性B(习惯问题:命名a不

Entity Framework Code First (四)Fluent API - 配置属性/类型

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 上篇博文说过当我们定义的类不能遵循约定(Conventions)的时候,Code First 提供了两种方式来配置你的类:DataAnnotations 和 Fluent API, 本文将关注 Fluent API.  一般来说我们访问 Flu

.net core 2.0 Code First Fluent API配置

A.net core 2.0新特性支持通过IEntityTypeConfiguration<>添加Code First配置到一个封装类. 新建目标框架为.NET Core类库 新建完了以后右键点击程序集,选择属性,选择目标框架为.NET Core 2.0 在EntityFrameworkCore程序集中添加类User(用户).Address(用户住址).Book(书).Author(作者).这里不讨论各个类设计的合理性和程序架构,主要目的是为了演示各个类之间的关系配置. User和Addres

使用 Fluent API 配置/映射属性和类型2

1.将多个实体类映射到数据库中的一个表 要将多个实体映射到一个数据库表需要满足: a. 两个实体必须是一对一关系 b.两个实体共享一个主键 1 public class MyContext:DbContext 2 { 3 public MyContext() 4 : base("test") 5 { } 6 protected override void OnModelCreating(DbModelBuilder modelBuilder) 7 { 8 modelBuilder.En

EntityFramework Code-First 简易教程(七)-------领域类配置之Fluent API

Fluent API配置: 前面我们已经了解到使用DataAnotations特性来覆写Code-First默认约定,现在我们来学习Fluent API. Fluent API是另一种配置领域类的方法,它比DataAnnotations特性提供更多的配置方法,下表是Fluent API支持的类型映射. 映射种类 配置数据库 模型(Model-wide)映射 设置默认架构 设置自定义约定 实体(Entity)映射 设置单表或多表和设置架构 设置复杂类型 设置继承层次结构 属性(Property)映

Fluent API in Code-First【Code-First系列】

在前面的章节中,我们已经看到了各种不同的数据注解特性.现在我们来学习一下Fluent API. Fluent API是另外一种配置领域类的方式,它提供了更多的配置相比数据注解特性. Mappings[映射] To Database[转成数据库] Model-wide Mapping[模型映射] Set default Schema[设置默认的Schema] Set Custom Convetions[自定义约定] Entity Mapping[实体映射] To Single or Multipl