我正在尝试创建一个通用的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.
我尝试使用该条目,但在CurrentValues中SysRowID仍为空白。此外,我尝试使用Find但它需要密钥,我无法添加ClientNum,因为我想以通用的方式为所有实体执行此操作。
答案 0 :(得分:1)
DbSet.Find
方法期望密钥的值。如果未将SysRowID
定义为您的密钥,则即使SysRowID
具有正确的值,此方法也不会返回值。
数据库优先:
如果您使用的是Database First,那么在EDMX模型中右键单击您的属性SysRowID
并单击属性,然后将 StoreGeneratedPattern 值更改为已计算强>
代码优先:
如果您使用的是Code First方法,则必须使用DatabaseGenerated属性修饰属性SysRowID
,并将DatabaseGeneratedOption.Computed
作为参数传递给属性的构造函数。最后,您将在您的财产上拥有此代码
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public System.Guid? SysRowID { get; set; }
通过执行此操作,您将处于Code First或Database First中,EF将知道此属性由数据库计算,并且它将在插入成功后检索它。