我首先使用带有.NET 4.5.1的DB第一个EF 6.1.3,T4生成的实体是具有生成的自动属性的POCO类。我想在保存到数据库之前做一些计算(实际计算的int字段)。
我当然可以使用UPDATE触发器执行此操作,但现在想要更喜欢C#算法。我已经在DBContext中查找了要覆盖的内容,但一无所获。最接近的赌注是ValidateEntity(...)
,但这让我觉得它的名字与其名称完全不同。 (不谈论如何访问实体实例似乎并不简单)
在更新或更好之前如何以及在何处完成自动计算:在属性设置?
答案 0 :(得分:1)
您可以执行以下操作,即覆盖SaveChanges。
public partial class MyEntities : ObjectContext
{
/// <summary>
/// Persists all updates to the data source with the specified System.Data.Objects.SaveOptions.
/// </summary>
/// <param name="saveOptions">A System.Data.Objects.SaveOptions value that determines the behavior of the operation.</param>
/// <returns>The number of objects in an System.Data.EntityState.Added, System.Data.EntityState.Modified, or
/// System.Data.EntityState.Deleted state when System.Data.Objects.ObjectContext.SaveChanges() was called.</returns>
public override int SaveChanges(SaveOptions saveOptions)
{
List<Itinerary> itineraryLocations = ItineraryAddedDeletedMonitor.GetItineraryLocations(this);
AlertManager.ObjectContextSavingChanges(this, null);
int changes = base.SaveChanges(saveOptions);
if (ItineraryAddedDeletedMonitor.ProcessItineraryLocations(this, itineraryLocations))
{
// new rows have been added
base.SaveChanges(saveOptions);
}
return changes;
}
}
<强>更新强>
要访问实体实例,下面示例中的objectStateEntries将获取所有已修改,已添加和已删除的实体(根据需要进行更改):
IEnumerable<ObjectStateEntry> objectStateEntries = objectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Added | EntityState.Deleted);
foreach (ObjectStateEntry entry in objectStateEntries)
{
if (!entry.IsRelationship && entry.Entity.GetType() == typeof(CustomerTransfer) && entry.State == EntityState.Deleted)
{
// Do some magic if the entity type is a CustomerTransfer that has been deleted.
}
}
更新:
...和变量objectContext是:
var objectContext = ((IObjectContextAdapter)this).ObjectContext;
答案 1 :(得分:1)
例如,您首先使用数据库生成具有生成的自动属性的用户。在.tt文件中会生成一个User.cs文件。这些是生成的,所以没有必要改变它们
你可以做的是创建一个新文件来包含元数据类,在这个例子中我将其称为EntityAnnotations.cs,这个原因我会称之为,你也可以用它来为你的实体属性添加注释。
如果用户生成的类(从现有数据库生成)具有
public partial class User
{
public int UserId { get; set; }
public string UserName { get; set; }
public string EmailAddress { get; set; }
public int CalculatedValue {get;set;}
}
你可以创建这个
[MetadataType(typeof(UserMetadata))]
public partial class User
{
public int Calculate
{
get { return CalculatedValue;}
set { CalculatedValue = value +1;}
}
}
然后
public class UserMetadata
{
//Fields from User requiring annotations
[EmailAddress]
public string EmailAddress { get; set; }
}
我现在已使用元数据对生成的实体强制执行电子邮件地址验证。我还使用partial类添加了一个Calculate
字段,它将从get
上生成的类返回CalculatedValue属性,并将calculatedValue属性设置为Calculate
上set
逻辑的结果}
答案 2 :(得分:0)
您可以使用the SavingChanges event。如果使用此技术,则可以查找所需类型的实体并在所需状态下进行修改。文档上的示例显示了如何查找这些实体。