通用添加检索

时间:2015-11-21 16:37:10

标签: c# entity-framework generics

我正在尝试创建一个通用的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,因为我想以通用的方式为所有实体执行此操作。

1 个答案:

答案 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将知道此属性由数据库计算,并且它将在插入成功后检索它。