【问题标题】:Customize Primary Key on ObjectContext.SaveChanges()自定义 ObjectContext.SaveChanges() 上的主键
【发布时间】:2014-05-12 09:53:53
【问题描述】:

我只是想知道是否可以仅在调用 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,我希望仅在用户单击保存时才分配它,这将调用

ObjectContext.SaveChanges();

如果用户调用它,我将获得一个新的主键并将其分配给 trans 实例。

【问题讨论】:

  • 你需要什么样的“定制化”?
  • @arvstractthoughts 你的目标是什么,自动递增整数有什么问题?
  • 嗨@Jaycee,自动增量没有问题,唯一的问题是他们不希望我使用他们提供给我的类库上生成的主键。
  • @RaphaëlAlthaus,我在帖子中提供了更多详细信息。

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


【解决方案1】:

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

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();
    }
}

【讨论】:

  • 我正在使用存储库模式,这很有帮助,但数据库设计只会接受生成的 id 作为主键,并且还有其他 poco 可以这样做。
  • @arvstractthoughts 我修复了它应该工作的数据模型
  • Jaycee, "var entity = (Transaction)changedEntity.Entity;"意味着这只适用于“交易 POCO” 我还有其他 POCS 可以这样做,例如“用户”、“公司”,是否可以使用您提供的代码的通用方法?
  • @arvstractthoughts 已更新,如果我在手机上编辑时出现语法错误,请见谅 :)
  • 我会试试这个,看看这是否适用于我当前的代码,谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 2018-05-31
  • 2020-06-20
相关资源
最近更新 更多