English 中文(简体)
页: 1
原标题:ef4 record stamping, inserted_at, inserted_by

是否有办法通过所有新的/经修改的实体,在田地建立、插入、更新的实体?

反对: 我可以找到这些实体的名单,但找不到确定实体财产价值的方法。

foreach (var item in db.ObjectStateManager.GetObjectStateEntries(EntityState.Added))
{
System.Data.Objects.DataClasses.EntityObject entity = (System.Data.Objects.DataClasses.EntityObject)(item.Entity);
// now how can I set its .inserted_at to DateTime.Now
}

我的目前解决办法

public interface IUpdateTrack
{
    DateTime? updated_at { get; set; }
    Guid? updated_by { get; set; }
}
public interface IInsertTrack
{
    DateTime? inserted_at { get; set; }
    Guid? inserted_by { get; set; }
}

部分类别中的接口

public partial class crm_customer : BaseDB.IInsertTrack, BaseDB.IUpdateTrack

储存舱

public void Save()
{
    foreach (var item in db.ObjectStateManager.GetObjectStateEntries(EntityState.Added))
    {
        System.Data.Objects.DataClasses.EntityObject entity = (System.Data.Objects.DataClasses.EntityObject)(item.Entity);
        if (item.Entity is BaseDB.IInsertTrack)
        {
            IInsertTrack insert_track = (IInsertTrack)(item.Entity);
            insert_track.inserted_at = DateTime.Now;
            insert_track.inserted_by = BaseDB.SessionContext.Current.ActiveUser.UserUid;
        }
    }
    foreach (var item in db.ObjectStateManager.GetObjectStateEntries(EntityState.Modified))
    {
        if (item.Entity is BaseDB.IUpdateTrack)
        {
            IUpdateTrack update_track = (IUpdateTrack)(item.Entity);
            update_track.updated_at = DateTime.Now;
            update_track.updated_by = BaseDB.SessionContext.Current.ActiveUser.UserUid;
        }
    }

I would like a solution that does not require implementing the interface for each class in the model, its error prone, you might forget to implement this interfaces for some classes. I am using EF4 using database-first approach.

最佳回答

Yes, there is a perfect way to accomplish this in Entity Framework 4.0, Thanks to Julia Lerman for pointing out this nice trick.


using System.Data.Common;
using System.Data.Metadata.Edm;
...

var entries = from e in db.ObjectStateManager.GetObjectStateEntries( EntityState.Added | EntityState.Modified) where e.Entity != null select e;

foreach (var entry in entries) {
var fieldMetaData = entry.CurrentValues.DataRecordInfo.FieldMetadata; FieldMetadata updatedAtField = fieldMetaData .Where(f => f.FieldType.Name == "updated_at").FirstOrDefault();

    if (updatedAtField.FieldType != null) {
       string fieldTypeName = updatedAtField.FieldType.TypeUsage.EdmType.Name;

        if (fieldTypeName == PrimitiveTypeKind.DateTime.ToString()) {
            entry.CurrentValues.SetDateTime(updatedAtField.Ordinal, 
                                            DateTime.Now);
        }
    }

}


You can then call this code from within the SavingChanges event to be sure that any updated_at field is automatically updated.

By the way, the System.Data.Metadata.Edm namespace gives you access to the PrimitiveTypeKind class.
问题回答

暂无回答




相关问题
Entity Framework with MySQL connector in c#

I have been trying to get the Entity Framework to work in my web application using MySQL. It works fine on my local pc, but doesn t work when I put it on the server. Since the server is a shared ...

How Do I Create And Update A Many To Many Relationship With EF

I am using the Entity Framework with SQL Server. I have a many to many relationship between 2 tables. I have created a join table with just the primary key fields of the 2 tables. In the designer, the ...

Entity Framework with File-Based Database

I am in the process of developing a desktop application that needs a database. The application is currently targeted to SQL Express 2005 and works wonderfully. However, I m not crazy about having ...

Linq to enties, insert foreign keys

I am using the ADO entity framework for the first time and am not sure of the best way of inserting db recored that contain foreign keys. this is the code that i am using, I would appreciate any ...

Entity Framework - Many to many question

I have a table called ASB and a table called PeopleInvolved. There is a junction table called PeopleInvolved_ASB which simply contains an ASBID and a PeopleInvolvedID column. The columns act as a ...

Post back complex object from client side

I m using ASP.NET MVC and Entity Framework. I m going to pass a complex entity to the client side and allow the user to modify it, and post it back to the controller. But I don t know how to do that ...

ADO.NET Entity Data Model are not precise enough

I run this code: var cos = from k in _db.klienci_do_trasy where k.klient_id == 5 select k; but the query send to database is: SELECT * FROM `klienci_do_trasy` LIMIT 0, 30 why is it for, there ...

热门标签