EF 配置一对多的关系

温故而知新

对于EF的配置, 园子里已经很多了, 今天重点说的是一对多的关系配置和使用
对于配置请参考如下:

Entity Framework 5.0 Code First全面学习(月影)

EF Code First 学习笔记:关系(Gyoung)

EF性能之关联加载(田念明)

提出问题

两个类UserInfo和MemberCardOperation, 使用Fluent API进行配置(保持类的职责单一)
关系: MemberCardOperation:UserInfo=1:1
目的: 在获取MemberCardOperation的同时获取相应的操作人UserInfo

UserInfo类

/// <summary>
/// 用户
/// </summary>
public class UserInfo
{
    /// <summary>
    /// 编码
    /// </summary>
    public int Id { get; set; }

       /// <summary>
    /// 用户名
    /// </summary>
    public string UserName { get; set; }

    /// <summary>
    /// 密码
    /// </summary>
    public string Password { get; set; }

    /// <summary>
    /// 显示名
    /// </summary>
    public string DisplayName { get; set; }

    /// <summary>
    /// 有效状态
    /// </summary>
    public bool ValidStatus { get; set; }
}

注意: 在UserInfo没有导航属性, 即没有MemberCardOperation的集合

MemberCardOperation类

    /// <summary>
    /// 会员卡操作
    /// </summary>
    public class MemberCardOperation
    {
        /// <summary>
        /// 编码
        /// </summary>
        public int Id { get; set; }
        
        /// <summary>
        /// 卡号
        /// </summary>
        public string CardNo { get; set; }
        
        /// <summary>
        /// 操作时间
        /// </summary>
        public DateTime OperateTime { get; set; }

        /// <summary>
        /// 操作人
        /// </summary>
        public int Operator { get; set; }

        /// <summary>
        /// 操作人
        /// </summary>
        public virtual UserInfo UserInfo { get; set; }
        
        /// <summary>
        /// 描述
        /// 办卡, 退卡, 充值, 投注
        /// </summary>
        public string Description { get; set; }
    }

主要的配置

1 Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
2 Property(p => p.CardNo).IsRequired().HasMaxLength(64);
3 Property(p => p.OperationType).IsRequired();
4 HasRequired(p => p.UserInfo).WithMany().HasForeignKey(p => p.Operator);

关于配置

第一种情况:

用法: MemberCardOperation有引用属性UserInfo和外键属性Operator
配置: HasRequired(p => p.UserInfo).WithMany().HasForeignKey(p => p.Operator); // 直接使用属性指定为相应的外键

第二种情况:
用法: MemberCardOperation中只有引用属性UserInfo
配置: HasRequired(p => p.UserInfo).WithMany().Map(m => m.MapKey("Operator")); //使用Map进行外键的指定

注意: 外键的类型要与引用属性的主键类型保持一致

 

关于获取

第一种方法: 引用属性使用virtual关键字
public virtual UserInfo UserInfo { get; set;}

第二种方法: 在使用DbContext的时候, 使用Include关键字
context.MemberCardOperations.Include("UserInfo").Where(...)

这方面田念明同学的博客中已经说的很清楚了.

注意: 惰性加载问题:
1. "There is already an open DataReader associated with this Command which must be closed first."
解决方法: 在数据库连接字符串中添加MARS信息为true

<connectionStrings>
    <add name="Data" providerName="System.Data.SqlClient" connectionString="server=.;database=HData;uid=sa;pwd=password;multipleactiveresultsets=true" />
</connectionStrings>

 

posted on 2015-04-29 12:42  张无季  阅读(407)  评论(0)    收藏  举报