如何在EF中为POCO实体添加C#自动计算?

时间:2015-06-01 10:03:04

标签: c# .net entity-framework

我首先使用带有.NET 4.5.1的DB第一个EF 6.1.3,T4生成的实体是具有生成的自动属性的POCO类。我想在保存到数据库之前做一些计算(实际计算的int字段)。

我当然可以使用UPDATE触发器执行此操作,但现在想要更喜欢C#算法。我已经在DBContext中查找了要覆盖的内容,但一无所获。最接近的赌注是ValidateEntity(...),但这让我觉得它的名字与其名称完全不同。 (不谈论如何访问实体实例似乎并不简单)

在更新或更好之前如何以及在何处完成自动计算:在属性设置?

3 个答案:

答案 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属性设置为Calculateset逻辑的结果}

答案 2 :(得分:0)

您可以使用the SavingChanges event。如果使用此技术,则可以查找所需类型的实体并在所需状态下进行修改。文档上的示例显示了如何查找这些实体。