这资源解释了Computed
如何排除属性(仅在更新中?)。
指定属性应排除在更新之外。 表(“发票”)公共类InvoiceContrib { Key public int InvoiceID { get;set;}公共字符串代码{ get;set;} public InvoiceKind种类{ get;set;}写(假)公共字符串FakeProperty { get;set;}使用(var连接= My.ConnectionFactory()) { connection.Open();var发票= connection.GetAll().ToList();// FakeProperty跳过invoices.ForEach(x => x.FakeProperty += "z");isSuccess =connection.Update(发票);}
但是,Write(false)
不是实现了同样的目的吗?[Computed]
和[Write(false)]
有什么区别?
编辑:
为了回答我的问题,我刚刚检查了资源连系。它差点撞到这上面!是否有人能确认这两个属性是否执行相同的操作,但只是用两种不同的方式来表达,从而给他们的用户提供更好的抽象?
发布于 2019-08-27 03:44:31
[Computed]
和Write(false)
都将忽略属性,而INSERT
和UPDATE
操作都将忽略该属性。所以,两者都是一样的。你可以用其中任何一种。
文档 说:
[Write(true/false)]
-这个属性是可写的(不能)[Computed]
-此属性是计算的,不应该是更新的一部分。关于Write
**:** Write
**:**的
正如上面文档的第一行所述,Write
处理“可写”行为。这应该包括INSERT
和UPDATE
。
这也可以在源代码这里中得到证实。
变量属性= type.GetProperties().Where(IsWriteable).ToArray();.私有静态bool IsWriteable(PropertyInfo pi) { var属性=PropertyInfo false).AsList();if (attributes.Count = 1)返回true;var writeAttribute =(WriteAttribute)属性;返回writeAttribute.Write;}
关于Computed
**:** 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);
}
使用上面的代码,您将注意到,无论您选择装饰属性的哪个属性,它都不会被考虑为INSERT
或UPDATE
。因此,基本上,这两个属性都扮演着相同的角色。
这一点可以在github上的Dapper.Tests.Contrib测试项目中得到进一步证实。
表(“汽车”)公共类Car { public int Id { get;set;}公共字符串名称{ get;set;}计算出的公共字符串计算{ get;set;}}./插入的计算属性应被忽略(connection.Insert(新车{ Name =“沃尔沃”,Computed =“此属性应被忽略”}); 资料来源:1和2
查看上述代码中分配给属性的注释和值,可以清楚地表明,Computed
也应该忽略INSERT
操作的属性;这是测试的预期结果。
为什么这两种方法是为了同样的目的而提供的,目前还不清楚。它会引起混乱。
以下是一些附加的参考资料:
为此,我使用
[Computed]
或[Write("False")]
。这不适合你的情况吗?
很高兴我能帮忙。每一天都是上学的日子!我不知道为什么它们都存在,虽然我认为它们在功能上是一样的。我倾向于使用
[Computed]
,因为它稍微容易输入。
我理解使用Dapper.Contrib可以在写操作期间使用
Write
和Computed
属性忽略属性。但是,这将忽略insert和update上的属性。我需要一种在更新时忽略属性的方法。我的建议是增加两个属性..。也许叫Insertable(bool)
和Updateable(bool)
。当将false
值传递给这些值时,框架将排除给定操作的该属性。对于一个非常常见的问题,这是一种轻量级、直截了当的方法。
我不认为Computed
属性与计算柱有任何关系,因为Dapper.Contrib支持多RDBMS。
https://stackoverflow.com/questions/57673107
复制