diff --git a/FreeSql.Tests/DataAnnotations/MySqlFluentTest.cs b/FreeSql.Tests/DataAnnotations/MySqlFluentTest.cs index 903766df..c8cde155 100644 --- a/FreeSql.Tests/DataAnnotations/MySqlFluentTest.cs +++ b/FreeSql.Tests/DataAnnotations/MySqlFluentTest.cs @@ -1,5 +1,6 @@ using FreeSql.DataAnnotations; using FreeSql.Tests.DataContext.SqlServer; +using System; using Xunit; namespace FreeSql.Tests.DataAnnotations { @@ -56,5 +57,22 @@ namespace FreeSql.Tests.DataAnnotations { public string name { get; set; } = "defaultValue"; } + + [Fact] + public void IsIgnore() { + var item = new TestIsIgnore { }; + Assert.Equal(1, g.mysql.Insert().AppendData(item).ExecuteAffrows()); + + var find = g.mysql.Select().Where(a => a.id == item.id).First(); + Assert.NotNull(find); + Assert.Equal(item.id, find.id); + } + + class TestIsIgnore { + public Guid id { get; set; } + + [Column(IsIgnore = true)] + public bool isignore { get; set; } + } } } diff --git a/FreeSql.Tests/DataAnnotations/SqlServerFluentTest.cs b/FreeSql.Tests/DataAnnotations/SqlServerFluentTest.cs index 03746d7d..c178dcb7 100644 --- a/FreeSql.Tests/DataAnnotations/SqlServerFluentTest.cs +++ b/FreeSql.Tests/DataAnnotations/SqlServerFluentTest.cs @@ -1,5 +1,6 @@ using FreeSql.DataAnnotations; using FreeSql.Tests.DataContext.SqlServer; +using System; using Xunit; namespace FreeSql.Tests.DataAnnotations { @@ -81,6 +82,23 @@ namespace FreeSql.Tests.DataAnnotations { public string name { get; set; } = "defaultValue"; } + + [Fact] + public void IsIgnore() { + var item = new TestIsIgnore { }; + Assert.Equal(1, _sqlserverFixture.SqlServer.Insert().AppendData(item).ExecuteAffrows()); + + var find = _sqlserverFixture.SqlServer.Select().Where(a => a.id == item.id).First(); + Assert.NotNull(find); + Assert.Equal(item.id, find.id); + } + + class TestIsIgnore { + public Guid id { get; set; } + + [Column(IsIgnore = true)] + public bool isignore { get; set; } + } } } diff --git a/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs index faa2d176..ee6262e3 100644 --- a/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs @@ -246,6 +246,8 @@ namespace FreeSql.Tests.MySql { } [Fact] public void ToOne() { + var testnotfind = select.Where("1=2").First(a => a.CreateTime); + Assert.Equal(default(DateTime), testnotfind); } [Fact] public void ToSql() { diff --git a/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs index 8faed4fc..450e60f6 100644 --- a/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs +++ b/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs @@ -156,6 +156,8 @@ namespace FreeSql.Tests.Oracle { } [Fact] public void ToOne() { + var testnotfind = select.Where("1=2").First(a => a.CreateTime); + Assert.Equal(default(DateTime), testnotfind); } [Fact] public void ToSql() { diff --git a/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs b/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs index fe7b67c4..c108d2d4 100644 --- a/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs +++ b/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs @@ -226,6 +226,8 @@ namespace FreeSql.Tests.PostgreSQL { } [Fact] public void ToOne() { + var testnotfind = select.Where("1=2").First(a => a.CreateTime); + Assert.Equal(default(DateTime), testnotfind); } [Fact] public void ToSql() { diff --git a/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs index 29478dee..7bba7daf 100644 --- a/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs +++ b/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs @@ -158,6 +158,8 @@ namespace FreeSql.Tests.SqlServer { } [Fact] public void ToOne() { + var testnotfind = select.Where("1=2").First(a => a.CreateTime); + Assert.Equal(default(DateTime), testnotfind); } [Fact] public void ToSql() { diff --git a/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs index 4c0ce913..df42f4ce 100644 --- a/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs +++ b/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs @@ -167,6 +167,8 @@ namespace FreeSql.Tests.Sqlite { } [Fact] public void ToOne() { + var testnotfind = select.Where("1=2").First(a => a.CreateTime); + Assert.Equal(default(DateTime), testnotfind); } [Fact] public void ToSql() { diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index fc807fa5..ac75d49d 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.5.1.1 + 0.5.1.2 true YeXiangQin FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite. diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 9e8f2241..5305dfa1 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -377,6 +377,8 @@ namespace FreeSql.Internal.CommonProvider { var index = 0; var otherindex = 0; foreach (var prop in props.Values) { + if (tb.Table.ColumnsByCsIgnore.ContainsKey(prop.Name)) continue; + if (tb.Table.ColumnsByCs.TryGetValue(prop.Name, out var col)) { //普通字段 if (index > 0) field.Append(", "); var quoteName = _commonUtils.QuoteSqlName(col.Attribute.Name); diff --git a/FreeSql/Internal/Model/TableInfo.cs b/FreeSql/Internal/Model/TableInfo.cs index e204ee07..1b99d8b1 100644 --- a/FreeSql/Internal/Model/TableInfo.cs +++ b/FreeSql/Internal/Model/TableInfo.cs @@ -11,6 +11,7 @@ namespace FreeSql.Internal.Model { public Dictionary Properties { get; set; } = new Dictionary(StringComparer.CurrentCultureIgnoreCase); public Dictionary Columns { get; set; } = new Dictionary(StringComparer.CurrentCultureIgnoreCase); public Dictionary ColumnsByCs { get; set; } = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + public Dictionary ColumnsByCsIgnore { get; set; } = new Dictionary(StringComparer.CurrentCultureIgnoreCase); public ColumnInfo[] Primarys { get; set; } public string CsName { get; set; } public string DbName { get; set; } diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 1eba3196..7f044b3a 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -70,7 +70,6 @@ namespace FreeSql.Internal { IsPrimary = false, IsIgnore = false }; - if (colattr.IsIgnore) continue; if (string.IsNullOrEmpty(colattr.DbType)) colattr.DbType = tp?.dbtypeFull ?? "varchar(255)"; colattr.DbType = colattr.DbType.ToUpper(); @@ -104,6 +103,10 @@ namespace FreeSql.Internal { CsType = p.PropertyType, Attribute = colattr }; + if (colattr.IsIgnore) { + trytb.ColumnsByCsIgnore.Add(p.Name, col); + continue; + } trytb.Columns.Add(colattr.Name, col); trytb.ColumnsByCs.Add(p.Name, col); } @@ -807,6 +810,8 @@ namespace FreeSql.Internal { Expression.Assign(readpknullExp, Expression.Constant(false)) }); foreach (var ctorParm in ctorParms) { + if (typetb.ColumnsByCsIgnore.ContainsKey(ctorParm.Name)) continue; + var ispkExp = new List(); Expression readVal = Expression.Assign(readpkvalExp, Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp)); Expression readExpAssign = null; //加速缓存 @@ -823,7 +828,7 @@ namespace FreeSql.Internal { //判断主键为空,则整个对象不读取 //blockExp.Add(Expression.Assign(readpkvalExp, Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp))); - if (typetb.ColumnsByCs.TryGetValue(ctorParm.Name, out var trycol) && trycol.Attribute.IsPrimary) { + if (typetb.ColumnsByCs.TryGetValue(ctorParm.Name, out var trycol) && trycol.Attribute.IsPrimary == true) { ispkExp.Add( Expression.IfThen( Expression.AndAlso( @@ -892,6 +897,8 @@ namespace FreeSql.Internal { var props = type.GetProperties();//.ToDictionary(a => a.Name, a => a, StringComparer.CurrentCultureIgnoreCase); var propIndex = 0; foreach (var prop in props) { + if (typetb.ColumnsByCsIgnore.ContainsKey(prop.Name)) continue; + var ispkExp = new List(); var propGetSetMethod = prop.GetSetMethod(); Expression readVal = Expression.Assign(readpkvalExp, Expression.Call(rowExp, MethodDataReaderGetValue, tryidxExp)); @@ -909,7 +916,7 @@ namespace FreeSql.Internal { //判断主键为空,则整个对象不读取 //blockExp.Add(Expression.Assign(readpkvalExp, Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp))); - if (typetb.ColumnsByCs.TryGetValue(prop.Name, out var trycol) && trycol.Attribute.IsPrimary) { + if (typetb.ColumnsByCs.TryGetValue(prop.Name, out var trycol) && trycol.Attribute.IsPrimary == true) { ispkExp.Add( Expression.IfThen( Expression.AndAlso(