带检索的通用添加

本文关键字:添加 检索 | 更新日期: 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都会知道此属性是由数据库计算的,并且它会在插入成功后检索它。

相关文章: