码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2015-09-29 06:33:28      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!