1 回答
TA贡献1877条经验 获得超6个赞
和[Computed]
都会Write(false)
忽略属性 whileINSERT
以及UPDATE
操作。所以,它们两者是相同的。您可以使用其中任何一种。
文档如下:
[Write(true/false)]
- 该属性不可写
[Computed]
- 该属性是计算得出的,不应成为更新的一部分
关于Write
:
如上面文档的第一行所述,Write
处理“可写”行为。这应该包括INSERT
和UPDATE
。
var properties = type.GetProperties().Where(IsWriteable).ToArray();
...
...
...
private static bool IsWriteable(PropertyInfo pi)
{
var attributes = pi.GetCustomAttributes(typeof(WriteAttribute), false).AsList();
if (attributes.Count != 1) return true;
var writeAttribute = (WriteAttribute)attributes[0];
return writeAttribute.Write;
}
关于Computed
:
上面文档中的第二行有点宽泛。
不应成为更新的一部分
这是否意味着它可以成为 的一部分INSERT
?不,不是的; 它还涵盖了这两个动作。可以通过以下代码观察到这一点:
CREATE TABLE TestTable
(
[ID] [INT] IDENTITY (1,1) NOT NULL CONSTRAINT TestTable_P_KEY PRIMARY KEY,
[Name] [VARCHAR] (100) NOT NULL,
[ComputedCol] [VARCHAR] (100) NOT NULL DEFAULT '',
[NonWriteCol] [VARCHAR] (100) NOT NULL DEFAULT ''
)
[Table("TestTable")]
public class MyTable
{
[Key]
public int ID { get; set; }
public string Name { get; set; }
[Computed]
public string ComputedCol { get; set; }
[Write(false)]
public string NonWriteCol { get; set; }
}
int id;
using(SqlConnection conn = new SqlConnection(@"connection string"))
{
MyTable myTable = new MyTable();
myTable.Name = "Name";
myTable.ComputedCol = "computed";
myTable.NonWriteCol = "writable";
conn.Insert<MyTable>(myTable);
id = myTable.ID;
}
using(SqlConnection conn = new SqlConnection(@"connection string"))
{
MyTable myTable = conn.Get<MyTable>(id);
myTable.Name = "Name_1";
myTable.ComputedCol = "computed_1";
myTable.NonWriteCol = "writable_1";
conn.Update<MyTable>(myTable);
}
通过上面的代码,您将观察到无论您选择哪个属性来装饰属性,它都不会被考虑 forINSERT
或 for UPDATE
。所以基本上,这两个属性都扮演着相同的角色。
这可以在 github 上的Dapper.Tests.Contrib测试项目中得到进一步证实。
[Table("Automobiles")]
public class Car
{
public int Id { get; set; }
public string Name { get; set; }
[Computed]
public string Computed { get; set; }
}
...
...
...
//insert with computed attribute that should be ignored
connection.Insert(new Car { Name = "Volvo", Computed = "this property should be ignored" });
- 1 回答
- 0 关注
- 116 浏览
添加回答
举报