标签:
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
先这样吧,时间不早了,各位晚安了,如果对你有帮助,麻烦点个赞吧。
关于EntityFramework 一对多 Fluent API配置的问题
标签:
原文地址:http://www.cnblogs.com/strivelearn/p/4845377.html