From 2089a1f7476394acd6a96cf9f2dc2738966407c0 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Fri, 6 Mar 2020 17:01:30 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20LazyLoading=20?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E9=A1=B9=E7=9B=AE=20CSScript.Core=20?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=9A=84=20bug=EF=BC=9B=EF=BC=88=E4=BB=A5?= =?UTF-8?q?=E4=B8=8A=E9=83=BD=E4=B8=8D=E5=86=8D=E5=8D=87=E7=BA=A7=E8=AF=A5?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BaseEntityReadOnly.cs | 2 +- .../Net40/BaseEntityReadOnly.cs | 2 +- FreeSql.DbContext/DbSet/DbSet.cs | 2 +- FreeSql.DbContext/DbSet/DbSetSync.cs | 4 +- .../FreeSql.Tests.DbContext.csproj | 1 + .../FreeSql.Tests.DbContext/USERINFO.cs | 285 ++++++++++++++++++ .../FreeSql.Tests.DbContext/UnitTest1.cs | 29 ++ .../FreeSql.Tests.DbContext/departments(1).cs | 96 ++++++ .../FreeSql.Tests.DbContext/dept_user.cs | 21 ++ 9 files changed, 437 insertions(+), 5 deletions(-) create mode 100644 FreeSql.Tests/FreeSql.Tests.DbContext/USERINFO.cs create mode 100644 FreeSql.Tests/FreeSql.Tests.DbContext/departments(1).cs create mode 100644 FreeSql.Tests/FreeSql.Tests.DbContext/dept_user.cs diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs index 4d0e2ee0..e50030ab 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs +++ b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs @@ -140,7 +140,7 @@ namespace FreeSql isFirst = false; var itemType = item.GetType(); if (itemType == typeof(object)) return; - if (itemType.FullName.StartsWith("Submission#")) itemType = itemType.BaseType; + if (itemType.FullName.Contains("FreeSqlLazyEntity__")) itemType = itemType.BaseType; if (Orm.CodeFirst.GetTableByEntity(itemType)?.Primarys.Any() != true) return; if (item is BaseEntity == false) return; } diff --git a/Extensions/FreeSql.Extensions.BaseEntity/Net40/BaseEntityReadOnly.cs b/Extensions/FreeSql.Extensions.BaseEntity/Net40/BaseEntityReadOnly.cs index 33ff1a2f..7464f2fb 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/Net40/BaseEntityReadOnly.cs +++ b/Extensions/FreeSql.Extensions.BaseEntity/Net40/BaseEntityReadOnly.cs @@ -78,7 +78,7 @@ namespace FreeSql isFirst = false; var itemType = item.GetType(); if (itemType == typeof(object)) return; - if (itemType.FullName.StartsWith("Submission#")) itemType = itemType.BaseType; + if (itemType.FullName.Contains("FreeSqlLazyEntity__")) itemType = itemType.BaseType; if (Orm.CodeFirst.GetTableByEntity(itemType)?.Primarys.Any() != true) return; if (item is BaseEntity == false) return; } diff --git a/FreeSql.DbContext/DbSet/DbSet.cs b/FreeSql.DbContext/DbSet/DbSet.cs index 4c43e6ce..a25d4317 100644 --- a/FreeSql.DbContext/DbSet/DbSet.cs +++ b/FreeSql.DbContext/DbSet/DbSet.cs @@ -78,7 +78,7 @@ namespace FreeSql if (item == null) return; var itemType = item.GetType(); if (itemType == typeof(object)) return; - if (itemType.FullName.StartsWith("Submission#")) itemType = itemType.BaseType; + if (itemType.FullName.Contains("FreeSqlLazyEntity__")) itemType = itemType.BaseType; if (_db.Orm.CodeFirst.GetTableByEntity(itemType)?.Primarys.Any() != true) return; var dbset = _db.Set(itemType); dbset?.GetType().GetMethod("TrackToList", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(dbset, new object[] { list }); diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index 7ffb4adc..79171465 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -277,9 +277,9 @@ namespace FreeSql var isEquals = true; for (var midcolidx = tref.Columns.Count; midcolidx < tref.MiddleColumns.Count; midcolidx++) { - var refcol = tref.Columns[midcolidx - tref.Columns.Count]; + var refcol = tref.RefColumns[midcolidx - tref.Columns.Count]; var midval = FreeSql.Internal.Utils.GetDataReaderValue(refcol.CsType, _db.Orm.GetEntityValueWithPropertyName(tref.RefMiddleEntityType, midItem, tref.MiddleColumns[midcolidx].CsName)); - var refval = FreeSql.Internal.Utils.GetDataReaderValue(refcol.CsType, _db.Orm.GetEntityValueWithPropertyName(tref.RefEntityType, curList[curIdx], tref.Columns[midcolidx - tref.Columns.Count].CsName)); + var refval = FreeSql.Internal.Utils.GetDataReaderValue(refcol.CsType, _db.Orm.GetEntityValueWithPropertyName(tref.RefEntityType, curList[curIdx], refcol.CsName)); if (object.Equals(midval, refval) == false) { isEquals = false; diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext/FreeSql.Tests.DbContext.csproj b/FreeSql.Tests/FreeSql.Tests.DbContext/FreeSql.Tests.DbContext.csproj index 7247f3a8..a0c1aeda 100644 --- a/FreeSql.Tests/FreeSql.Tests.DbContext/FreeSql.Tests.DbContext.csproj +++ b/FreeSql.Tests/FreeSql.Tests.DbContext/FreeSql.Tests.DbContext.csproj @@ -16,6 +16,7 @@ + diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext/USERINFO.cs b/FreeSql.Tests/FreeSql.Tests.DbContext/USERINFO.cs new file mode 100644 index 00000000..5400bbd7 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests.DbContext/USERINFO.cs @@ -0,0 +1,285 @@ +using FreeSql; +using FreeSql.DataAnnotations; +using System; +using System.Collections.Generic; + +/// +/// 员工信息表 +/// +[Serializable] +[Index("员工代码badgenumber唯一", "badgenumber", true)] +public class userinfo : BaseEntity +{ + /// + /// 员工ID + /// + [Column(IsPrimary = true)] + [System.ComponentModel.DisplayName("员工ID ")] + [System.ComponentModel.DataAnnotations.Required()] + public int userid { get; set; } + + /// + /// 工号 + /// + [System.ComponentModel.DisplayName("工号")] + [System.ComponentModel.DataAnnotations.Required()] + [Column(Name = "BADGENUMBER", DbType = "VARCHAR(24)")] + public String badgenumber { get; set; } + + /// + /// 姓名 + /// + [System.ComponentModel.DisplayName("姓名")] + [System.ComponentModel.DataAnnotations.Required()] + [Column(DbType = "varchar(40) NULL")] + + public String Name { get; set; } + /// + /// 身份证 + /// + [System.ComponentModel.DisplayName("身份证证")] + [System.ComponentModel.DataAnnotations.Required()] + public String IDCardNo { get; set; } + + + + /// + /// 行动电话 + /// + [System.ComponentModel.DisplayName("行动电话")] + [Column(DbType = "varchar(20) NULL")] + public string pager { get; set; } + + /// + /// 邮件地址 + /// + [System.ComponentModel.DisplayName("邮件地址 ")] + public String email { get; set; } + + + + + /// + /// 办公电话 + /// + [System.ComponentModel.DisplayName("办公电话")] + [Column(DbType = "varchar(20) NULL")] + public String ophone { get; set; } + + /// + /// 入职时间 + /// + [System.ComponentModel.DisplayName("入职时间")] + [Column(DbType = "date")] + public DateTime? hiredday { get; set; } + + + + + /// + /// 生日 + /// + [System.ComponentModel.DisplayName("生日 ")] + [Column(DbType = "date")] + public DateTime? birthday { get; set; } + + + /// + /// 民族 + /// + [System.ComponentModel.DisplayName("民族")] + public string minzu { get; set; } + + /// + /// 籍贯 + /// + [System.ComponentModel.DisplayName("籍贯")] + public String homeaddress { get; set; } + + + /// + /// 合同日期 + /// + [System.ComponentModel.DisplayName("合同日期")] + [Column(DbType = "date")] + public DateTime? hetongdate { get; set; } + + /// + /// 家庭地址 + /// + [System.ComponentModel.DisplayName("家庭地址")] + [Column(DbType = "varchar(80) NULL")] + public String street { get; set; } + + + /// + /// 邮编 + /// + [System.ComponentModel.DisplayName("邮编")] + [Column(DbType = "varchar(12) NULL")] + public String zip { get; set; } + + [System.ComponentModel.DisplayName("城市")] + [Column(Name = "CITY", DbType = "varchar(2)")] + public string CITY { get; set; } + + [System.ComponentModel.DisplayName("省份")] + [Column(DbType = "varchar(2) NULL")] + public string STATE { get; set; } + + + /// + /// 编号 + /// + [System.ComponentModel.DisplayName("编号")] + + public string ssn { get; set; } + + [Column(DbType = "varchar(8) NULL")] + public string GENDER { get; set; } = "M"; + /// + /// 职务 + /// + [System.ComponentModel.DisplayName("职务")] + [Column(DbType = "varchar(20) NULL")] + public string title { get; set; } + + + public short? VERIFICATIONMETHOD { get; set; }//验证方式 + public short? DEFAULTDEPTID { get; set; } = 1;//所属部门ID号 + public short? ATT { get; set; } = 1;//考勤有效 + public short? INLATE { get; set; } = 1;//计迟到 + public short? OUTEARLY { get; set; } = 1;//计早退 + + public short? OVERTIME { get; set; } + + public short? SEP { get; set; } = 1; + public short HOLIDAY { get; set; } = 1;//假日休息 + public string PASSWORD { get; set; }//口令 + public short LUNCHDURATION { get; set; } = 1;//有午休 + public string MVerifyPass { get; set; }//考勤验证密码 + + //[Column(DbType = "image NULL")] + //public byte[] PHOTO { get; set; } + //[Column(DbType = "image NULL")] + //public byte[] Notes { get; set; } + + public int? VerifyCode { get; set; } + public int? Expires { get; set; } + public int? ValidCount { get; set; } + public int? UseAccGroupTZ { get; set; } + + public int? AccGroup { get; set; } + public int? FaceGroup { get; set; } + public int? EMPRIVILEGE { get; set; } + public int? InheritDeptRule { get; set; } + public int? RegisterOT { get; set; } + public int? MinAutoSchInterval { get; set; } + public int? AutoSchPlan { get; set; } + public int? InheritDeptSchClass { get; set; } + public int? InheritDeptSch { get; set; } + public int? privilege { get; set; } + public int? TimeZone1 { get; set; } + public int? TimeZone2 { get; set; } + public int? TimeZone3 { get; set; } + + [Column(DbType = "date")] + public DateTime? ValidTimeEnd { get; set; } + [Column(DbType = "date")] + public DateTime? ValidTimeBegin { get; set; } + + /// + /// 家庭电话 + /// + [System.ComponentModel.DisplayName("家庭电话")] + [Column(DbType = "varchar(20) NULL")] + public String fphone { get; set; } + + /// + /// 卡号 + /// + [System.ComponentModel.DisplayName("卡号 ")] + [Column(Name = "CardNo", DbType = "varchar(20)")] + public String CardNo { get; set; } + + + + /// + /// 身份证有效期 + /// + [System.ComponentModel.DisplayName("身份证有效期 ")] + public String idcardvalidtime { get; set; } = new DateTime(2099, 12, 31).ToString(); + + + + + + /// + /// 离职日期 + /// + [System.ComponentModel.DisplayName("离职日期")] + [Column(DbType = "date")] + public DateTime? leavedate { get; set; } + + /// + /// 登录密码 + /// + [System.ComponentModel.DisplayName("登录密码")] + public String loginpass { get; set; } + + + /// + /// 相片地址 + /// + [System.ComponentModel.DisplayName("相片地址")] + public String picurl { get; set; } + + /// + /// 上级主管 + /// + [System.ComponentModel.DisplayName("上级主管")] + public int? managerid { get; set; } + ///// + ///// 上级主管对象 + ///// + //[Navigate("managerid")] + //public userinfo pManager { get; set; } + + + + [Navigate(ManyToMany = typeof(dept_user))] + public List depts { get; set; } + + /// + /// 管理员标志 + /// + + [System.ComponentModel.DisplayName("管理员标志")] + public short? SECURITYFLAGS { get; set; }//管理员标志 + + + + + + + + + + + + + + + + +} + + + + + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext/UnitTest1.cs b/FreeSql.Tests/FreeSql.Tests.DbContext/UnitTest1.cs index d8f4c6a6..1f2e7e9c 100644 --- a/FreeSql.Tests/FreeSql.Tests.DbContext/UnitTest1.cs +++ b/FreeSql.Tests/FreeSql.Tests.DbContext/UnitTest1.cs @@ -21,6 +21,35 @@ namespace FreeSql.Tests [Fact] public void Include_ManyToMany() { + g.sqlite.Delete().Where("1=1").ExecuteAffrows(); + g.sqlite.Delete().Where("1=1").ExecuteAffrows(); + g.sqlite.Delete().Where("1=1").ExecuteAffrows(); + BaseEntity.Initialization(g.sqlite); + + userinfo user = new userinfo { userid = 1 }; + user.Insert(); + + user.depts = new List( + new[] { + new DEPARTMENTS { deptid = 1, deptcode = "01" }, + new DEPARTMENTS { deptid = 2, deptcode = "02" }, + new DEPARTMENTS { deptid = 3, deptcode = "03" }, + }); + user.SaveMany("depts"); + + user.depts = new List( + new[] { + new DEPARTMENTS { deptid = 1, deptcode = "01" }, + new DEPARTMENTS { deptid = 2, deptcode = "02" }, + new DEPARTMENTS { deptid = 4, deptcode = "04" }, + }); + user.SaveMany("depts"); + + user.depts = new List( + new[] { + new DEPARTMENTS { deptid = 2, deptcode = "02" }, + }); + user.SaveMany("depts"); g.sqlite.CodeFirst.SyncStructure(); g.sqlite.CodeFirst.SyncStructure(); diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext/departments(1).cs b/FreeSql.Tests/FreeSql.Tests.DbContext/departments(1).cs new file mode 100644 index 00000000..6ce4d586 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests.DbContext/departments(1).cs @@ -0,0 +1,96 @@ +using FreeSql; +using FreeSql.DataAnnotations; +using System; +using System.Collections.Generic; + + + +/// +/// 部门表 +/// +[Serializable] +[Index("部门代码deptcode唯一", "deptcode", true)] +public class DEPARTMENTS : BaseEntity +{ + /// + /// 部门ID + /// + [Column(IsPrimary = true)] + + [System.ComponentModel.DisplayName("部门ID")] + public int deptid { get; set; } + + ///// + ///// 员工列表 对应employee.deptid + ///// + //[Navigate("deptid")] + //public List Employees { get; set; } + + /// + /// 上级部门ID + /// + [System.ComponentModel.DisplayName("上级部门ID")] + public int? supdeptid { get; set; } + /// + /// 上级部门对象 + /// + [Navigate("supdeptid")] + public DEPARTMENTS pDepartments { get; set; } + + /// + /// 部门主管ID + /// + [System.ComponentModel.DisplayName("部门主管ID")] + public int? managerid { get; set; } + /// + /// 部门主管对象 + /// + [Navigate("managerid")] + public userinfo manager { get; set; } + + + ///// + ///// 下级部门列表 + ///// + //[Navigate("supdeptid")] + //public List childDepartments { get; set; } + + + [Navigate(ManyToMany = typeof(dept_user))] + public List employeesMany { get; set; } + + + #region MyRegion + /// + /// 部门代码 + /// + [System.ComponentModel.DisplayName("部门代码")] + [System.ComponentModel.DataAnnotations.Required()] + public string deptcode { get; set; } + + /// + /// 部门名称 + /// + [System.ComponentModel.DisplayName("部门名称")] + [System.ComponentModel.DataAnnotations.Required()] + public string deptname { get; set; } + #endregion + + public short? InheritParentSch { get; set; } + public short? InheritDeptSch { get; set; } + public short? InheritDeptSchClass { get; set; } + public short? AutoSchPlan { get; set; } + public short? InLate { get; set; } + public short? OutEarly { get; set; } + public short? InheritDeptRule { get; set; } + public int? MinAutoSchInterval { get; set; } + public short? RegisterOT { get; set; } + public int? DefaultSchId { get; set; } + public short? ATT { get; set; } + public short? Holiday { get; set; } + public short? OverTime { get; set; } + + + +} + diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext/dept_user.cs b/FreeSql.Tests/FreeSql.Tests.DbContext/dept_user.cs new file mode 100644 index 00000000..f6cf1e0f --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests.DbContext/dept_user.cs @@ -0,0 +1,21 @@ +using FreeSql.DataAnnotations; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FreeSql; + +public class dept_user: BaseEntity + { + public int deptid { get; set; } + public int userid { get; set; } + + [Navigate("deptid")] + public DEPARTMENTS dept { get; set; } + + + [Navigate("userid")] + public userinfo emp { get; set; } + } +