Entity framework EF代码优先:手动递增非自动递增字段

Entity framework EF代码优先:手动递增非自动递增字段,entity-framework,entity-framework-4,ef-code-first,Entity Framework,Entity Framework 4,Ef Code First,我正在使用ERP中的现有数据库 在我所有的数据库表中,都有一个名为“r_e_c_n_o_”的浮点字段,但这个字段不是由数据库自动递增的,我无法更改它 对于所有添加的实体,我想增加这个字段“r_e_c_n_o_”,我如何在DbContext的SaveChanges()方法中完成它 使用ADO.NET,我可以执行以下操作: public static int GetNext(string tableName, string fieldName) { var cmd =

我正在使用ERP中的现有数据库

在我所有的数据库表中,都有一个名为“r_e_c_n_o_”的浮点字段,但这个字段不是由数据库自动递增的,我无法更改它

对于所有添加的实体,我想增加这个字段“r_e_c_n_o_”,我如何在DbContext的SaveChanges()方法中完成它

使用ADO.NET,我可以执行以下操作:

    public static int GetNext(string tableName, string fieldName)
    {
        var cmd = _conn.CreateCommand(string.Format("SELECT MAX({0}) + 1 FROM {1}", fieldName, tableName));
        var result = (int)cmd.ExecuteScalar();
        return result;
    }
更新: 请看下面的评论,这正是我需要解决的问题:

    public override int SaveChanges()
    {
        var entries = this.ChangeTracker.Entries();
        Dictionary<string, int> lastRecnos = new Dictionary<string, int>();
        foreach (var entry in entries)
        {
            var typeName = entry.Entity.GetType().Name;

            if (lastRecnos.ContainsKey(typeName))
                lastRecnos[typeName]++;
            else
                lastRecnos[typeName] = 0;//How can i get the max here?

            int nextRecnoForThisEntity = lastRecnos[typeName];

            var entity = entry.Entity as EntityBase;
            entity.Recno = nextRecnoForThisEntity;


        }
        return base.SaveChanges();
    }
public override int SaveChanges()
{
var entries=this.ChangeTracker.entries();
Dictionary lastRecnos=新字典();
foreach(分录中的var分录)
{
var typeName=entry.Entity.GetType().Name;
if(lastRecnos.ContainsKey(typeName))
lastRecnos[typeName]++;
其他的
lastRecnos[typeName]=0;//如何在此处获取最大值?
int nextRecnoForThisEntity=lastRecnos[typeName];
var entity=entry.entity作为EntityBase;
entity.Recno=nextReconforthis entity;
}
返回base.SaveChanges();
}
Tks,
William

这是非常危险的,因为如果在插入新记录之前执行并发操作,您将获得相同的值(+SQL注入危险)。我知道,但我别无选择……提供我们ERP的第三方公司使用这种方法,他们根本不使用自动递增字段。。因此,我需要在我的应用程序中遵循相同的方法。。。。。实现这一目标的最佳方式是什么?我需要使用EF-codefirst来实现这一点。正确的方法需要对表进行密集锁定,只允许单个事务在原子操作中读取值和插入记录。好的,我理解这样做的风险。。。。。但是我需要。。。我的所有实体类都继承自具有“Recno”属性的基类。。。在SaveChanges()方法上的dbcontext中,我想为所有添加的实体设置此属性的“最大值”+1,我该怎么做?如果您需要知道将逻辑检查放在哪里,但仍然必须解决并发性问题以强制唯一性,否则您可能损坏ERP数据库=被解雇的最佳方式。还要注意,在
SaveChanges
中,在将任何记录插入数据库之前,必须设置所有ID。