EF 配置一对多的关系
温故而知新
对于EF的配置, 园子里已经很多了, 今天重点说的是一对多的关系配置和使用
对于配置请参考如下:
Entity Framework 5.0 Code First全面学习(月影)
提出问题
两个类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>
浙公网安备 33010602011771号