在ObjectContext.SaveChanges()上自定义主键

时间:2014-05-12 09:53:53

标签: c# entity-framework orm entity-framework-4

我只是想知道在调用ObjectContext.SaveChanges()时是否可以分配自定义主键?

我试图寻找任何解决方案,但似乎我是唯一一个考虑这个问题的人。

当你有一个标识列时会发生同样的情况,一旦调用了ObjectContext.SaveChanges(),EF就会自动分配一个主键,而不是主键是一个自动标识列,我希望自定义我自己的主键。

先谢谢你们。

修改:其他详细信息

示例我有这个类:

public class Transaction()
{
    public string ID { get; set; }
    public DateTime TransactionDate { get; set; }
}

我不想像这样在对象集中添加​​类:

Transaction trans = new Transaction()
{
    ID = null,
    TransactionDate = DateTime.Now
};

ObjectSet.AddObject(trans);

请注意,我还没有分配ID,我希望仅在用户点击“保存”时分配该ID才能分配

ObjectContext.SaveChanges();

一个用户称之为,我将获得一个新的主键并将其分配给 trans 实例。

1 个答案:

答案 0 :(得分:1)

不理想但请考虑将模型更改为此。您的POCO现在包含一些不好的逻辑,但它允许您自定义保存以从第三方类库创建您的ID。默认情况下,字符串ID列将解析为类型为nvarchar(128)的主键。在保存之前,您的ID将为null。

public abstract class Entity
{
    public virtual void OnSave();
}

public class Transaction : Entity
{
    public string ID { get; set; }
    public DateTime TransactionDate { get; set; }

    public override void OnSave()
    {
        ID = Guid.NewGuid().ToString(); //call to class library
    }
}

您可以通过在DbContext中重写它来挂钩SaveChanges方法

public class MyContext : DbContext
{
    public DbSet<Transaction> Trans { get; set; }

    public MyContext () : base()
    {
    }

    public override int SaveChanges()
    {
        var changedEntities = ChangeTracker.Entries();
        foreach (var changedEntity in changedEntities)
        {
            var entity = (Entity)changedEntity.Entity;
            entity.OnSave();
        }
        return base.SaveChanges();
    }
}