当前位置:首页 > Windows程序 > 正文

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

2021-03-25 Windows程序

例子:目的地类(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

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/66964.html