带检索的通用添加
本文关键字:添加 检索 | 更新日期: 2023-09-27 18:23:49
我正在尝试创建一个通用Add,它将从DB返回实际值,因为其中一些值可能是由SQL计算的。
例如:
public partial class Customer
{
public string ClientNum { get; set; }
public string ClientName { get; set; }
public string CompanyName { get; set; }
public string Adress { get; set; }
public System.Guid SysRowID { get; set; }
}
SysRowId在SQL中计算为newid()。所以,在插入新记录后,我想做一个查找。我该如何以通用的方式做到这一点?
到目前为止,我有这个:
var newDBRow = CreateDBRow(tableIndex);
FillValues(newDBRow);
Db.Set(newDBRow.GetType()).Add(newDBRow);
Db.SaveChanges();
var entry = Db.Entry(newDBRow); //SysRowID is blank at CurrentValues
newDBRow = Db.Set(newDBRow.GetType()).Find(KeysNeededHere); //Unable to get the entity keys.
我尝试使用该条目,但SysRowID在CurrentValues处仍然为空。此外,我尝试使用Find,但它需要密钥,并且我无法添加ClientNum,因为我希望以通用的方式为所有实体添加ClientNum。
DbSet.Find
方法需要键的值。如果未将SysRowID
定义为键,则即使SysRowID
具有正确的值,此方法也永远不会返回值。
数据库优先:如果您使用的是Database First,那么在EDMX模型中,右键单击属性SysRowID
并单击属性,然后将StoreGeneratedPattern值更改为Computed。
代码优先:如果使用"代码优先"方法,则必须使用DatabaseGenerated属性装饰属性SysRowID
,并将DatabaseGeneratedOption.Computed
作为参数传递给该属性的构造函数。最后,你会在你的房产上有这个代码
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public System.Guid? SysRowID { get; set; }
通过这样做,无论您是在代码优先还是数据库优先,EF都会知道此属性是由数据库计算的,并且它会在插入成功后检索它。