Skip to content

Commit

Permalink
- 增加 ColumnAttribute 可插入(CanInsert)、可更新(CanUpdate);#99
Browse files Browse the repository at this point in the history
  • Loading branch information
28810 authored and 28810 committed Sep 26, 2019
1 parent d4c766e commit 6ca226a
Show file tree
Hide file tree
Showing 7 changed files with 137 additions and 1 deletion.
41 changes: 40 additions & 1 deletion FreeSql.Tests/FreeSql.Tests/DataAnnotations/MySqlFluentTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -125,13 +125,52 @@ public void IsIgnore()
Assert.NotNull(find);
Assert.Equal(item.id, find.id);
}

class TestIsIgnore
{
public Guid id { get; set; }

[Column(IsIgnore = true)]
public bool isignore { get; set; }
}

[Fact]
public void CanInsert_CanUpdate()
{
var item = new TestCanInsert { title = "testtitle", testfield1 = 1000, testfield2 = 1000 };
var sql = g.mysql.Insert(item).ToSql().Replace("\r\n", "");
Assert.Equal("INSERT INTO `TestCanInsert`(`id`, `title`, `testfield2`) VALUES(?id_0, ?title_0, ?testfield2_0)", sql);

Assert.Equal(1, g.mysql.Insert(item).ExecuteAffrows());
var find = g.mysql.Select<TestCanInsert>().Where(a => a.id == item.id).First();
Assert.NotNull(find);
Assert.Equal(item.id, find.id);
Assert.Equal(item.title, find.title);
Assert.NotEqual(item.testfield1, find.testfield1);
Assert.Equal(0, find.testfield1);
Assert.Equal(item.testfield2, find.testfield2);

item.title = "testtitle_update";
item.testfield2 = 0;
sql = g.mysql.Update<TestCanInsert>().SetSource(item).ToSql().Replace("\r\n", "");
Assert.Equal($"UPDATE `TestCanInsert` SET `id` = ?p_0, `title` = ?p_1, `testfield1` = ?p_2 WHERE (`id` = '{item.id}')", sql);

Assert.Equal(1, g.mysql.Update<TestCanInsert>().SetSource(item).ExecuteAffrows());
find = g.mysql.Select<TestCanInsert>().Where(a => a.id == item.id).First();
Assert.NotNull(find);
Assert.Equal(item.id, find.id);
Assert.Equal(item.title, find.title);
Assert.Equal(item.testfield1, find.testfield1);
Assert.NotEqual(item.testfield2, find.testfield2);
Assert.Equal(1000, find.testfield1);
}
class TestCanInsert
{
public Guid id { get; set; }
public string title { get; set; }
[Column(CanInsert = false)]
public long testfield1 { get; set; }
[Column(CanUpdate = false)]
public long testfield2 { get; set; }
}
}
}
10 changes: 10 additions & 0 deletions FreeSql/DataAnnotations/ColumnAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -94,5 +94,15 @@ public string Unique
/// &lt;0时排后面,...-3,-2,-1
/// </summary>
public short Position { get => _Position ?? 0; set => _Position = value; }

internal bool? _CanInsert, _CanUpdate;
/// <summary>
/// 该字段是否可以插入,默认值true,指定为false插入时该字段会被忽略
/// </summary>
public bool CanInsert { get => _CanInsert ?? true; set => _CanInsert = value; }
/// <summary>
/// 该字段是否可以更新,默认值true,指定为false更新时该字段会被忽略
/// </summary>
public bool CanUpdate { get => _CanUpdate ?? true; set => _CanUpdate = value; }
}
}
21 changes: 21 additions & 0 deletions FreeSql/DataAnnotations/ColumnFluent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -113,5 +113,26 @@ public ColumnFluent Position(short value)
_column.Position = value;
return this;
}

/// <summary>
/// 该字段是否可以插入,默认值true,指定为false插入时该字段会被忽略
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public ColumnFluent CanInsert(bool value)
{
_column.CanInsert = value;
return this;
}
/// <summary>
/// 该字段是否可以更新,默认值true,指定为false更新时该字段会被忽略
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public ColumnFluent CanUpdate(bool value)
{
_column.CanUpdate = value;
return this;
}
}
}
34 changes: 34 additions & 0 deletions FreeSql/FreeSql.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions FreeSql/Internal/CommonProvider/InsertProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,26 @@ public InsertProvider(IFreeSql orm, CommonUtils commonUtils, CommonExpression co
_table = _commonUtils.GetTableByEntity(typeof(T1));
_noneParameter = _orm.CodeFirst.IsNoneCommandParameter;
if (_orm.CodeFirst.IsAutoSyncStructure && typeof(T1) != typeof(object)) _orm.CodeFirst.SyncStructure<T1>();
IgnoreCanInsert();
}

/// <summary>
/// AsType, Ctor, ClearData 三处地方需要重新加载
/// </summary>
protected void IgnoreCanInsert()
{
if (_table == null || _table.Type == typeof(object)) return;
foreach (var col in _table.Columns.Values)
if (col.Attribute.CanInsert == false)
_ignore.Add(col.Attribute.Name, true);
}
protected void ClearData()
{
_insertIdentity = false;
_source.Clear();
_ignore.Clear();
_params = null;
IgnoreCanInsert();
}

public IInsert<T1> WithTransaction(DbTransaction transaction)
Expand Down Expand Up @@ -569,6 +581,7 @@ public IInsert<T1> AsType(Type entityType)
var newtb = _commonUtils.GetTableByEntity(entityType);
_table = newtb ?? throw new Exception("IInsert.AsType 参数错误,请传入正确的实体类型");
if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(entityType);
IgnoreCanInsert();
return this;
}

Expand Down
13 changes: 13 additions & 0 deletions FreeSql/Internal/CommonProvider/UpdateProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,19 @@ public UpdateProvider(IFreeSql orm, CommonUtils commonUtils, CommonExpression co
_noneParameter = _orm.CodeFirst.IsNoneCommandParameter;
this.Where(_commonUtils.WhereObject(_table, "", dywhere));
if (_orm.CodeFirst.IsAutoSyncStructure && typeof(T1) != typeof(object)) _orm.CodeFirst.SyncStructure<T1>();
IgnoreCanUpdate();
}

/// <summary>
/// AsType, Ctor, ClearData 三处地方需要重新加载
/// </summary>
protected void IgnoreCanUpdate()
{
if (_table == null || _table.Type == typeof(object)) return;
foreach (var col in _table.Columns.Values)
if (col.Attribute.CanUpdate == false)
_ignore.Add(col.Attribute.Name, true);
}
protected void ClearData()
{
_source.Clear();
Expand All @@ -51,6 +62,7 @@ protected void ClearData()
_setIncr.Clear();
_params.Clear();
_paramsSource.Clear();
IgnoreCanUpdate();
}

public IUpdate<T1> WithTransaction(DbTransaction transaction)
Expand Down Expand Up @@ -610,6 +622,7 @@ public IUpdate<T1> AsType(Type entityType)
var newtb = _commonUtils.GetTableByEntity(entityType);
_table = newtb ?? throw new Exception("IUpdate.AsType 参数错误,请传入正确的实体类型");
if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(entityType);
IgnoreCanUpdate();
return this;
}

Expand Down
6 changes: 6 additions & 0 deletions FreeSql/Internal/CommonUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@ public ColumnAttribute GetEntityColumnAttribute(Type type, PropertyInfo proto)
if (trycol._Uniques != null) attr._Uniques = trycol._Uniques;
if (trycol.MapType != null) attr.MapType = trycol.MapType;
if (trycol._Position != null) attr._Position = trycol.Position;
if (trycol._CanInsert != null) attr._CanInsert = trycol.CanInsert;
if (trycol._CanUpdate != null) attr._CanUpdate = trycol.CanUpdate;
if (trycol.DbDefautValue != null) attr.DbDefautValue = trycol.DbDefautValue;
}
var attrs = proto.GetCustomAttributes(typeof(ColumnAttribute), false);
Expand All @@ -146,6 +148,8 @@ public ColumnAttribute GetEntityColumnAttribute(Type type, PropertyInfo proto)
if (tryattr._Uniques != null) attr._Uniques = tryattr._Uniques;
if (tryattr.MapType != null) attr.MapType = tryattr.MapType;
if (tryattr._Position != null) attr._Position = tryattr.Position;
if (tryattr._CanInsert != null) attr._CanInsert = tryattr.CanInsert;
if (tryattr._CanUpdate != null) attr._CanUpdate = tryattr.CanUpdate;
if (tryattr.DbDefautValue != null) attr.DbDefautValue = tryattr.DbDefautValue;
}
ColumnAttribute ret = null;
Expand All @@ -160,6 +164,8 @@ public ColumnAttribute GetEntityColumnAttribute(Type type, PropertyInfo proto)
if (attr._Uniques != null) ret = attr;
if (attr.MapType != null) ret = attr;
if (attr._Position != null) ret = attr;
if (attr._CanInsert != null) ret = attr;
if (attr._CanUpdate != null) ret = attr;
if (attr.DbDefautValue != null) ret = attr;
if (ret != null && ret.MapType == null) ret.MapType = proto.PropertyType;
return ret;
Expand Down

0 comments on commit 6ca226a

Please sign in to comment.