是否可以自动递增 属性 而不是 Entity Framework 中的主键?

Is it possible to auto increment a property which is not the primary key in Entity Framework?

是否可以在Entity Framework中使用"auto increment"函数有一个主键和另一个不是主键的字段?

我在网上找到这个,试过了,但是不行:

public int Id { get; set; }

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ImageId { get; set; }

在这种情况下,Id 始终为 0。

所以现在我回到这个:Id 是主键,我使用 MAX(Id) + 1 来递增 ImageId 整数。

更新: 我什至想为 ImageId 创建另一个 table。但我不确定这会不会有点矫枉过正。

我以前试过这个。 MSSQL 确实支持它。从记忆中 EF 也不允许定义。

我的解决方案: 我创建了一个辅助 table 我称之为 IDPool。唯一目的是生成唯一的 ID 序列。我在主要 table 中使用了该值。在这种情况下,我也可以使用 GUID。否则 Guid 是显而易见的选择。

编辑:提示要实现 easier/safer,请并行使用第二个上下文。 这第二个上下文是为了获取Id,你可以提交而不用担心干扰主上下文中的当前更新。

      var miniRep = luw.GetRepositoryMini<IdPool>();  // mini context managed here.
      var nextrec = new IdPool()
      miniRep.Add(nextrec);
      miniRep.SaveChanges();
      return nextrec.Id

乔斯莫,

试试这个:

public static class ID
{
    // Enumeration for parameter in NewID() method.
    public enum Type { Customer, Vendor, Product, Transaction };
}

public class MyClass
{
    // Variables hold the last ID. This will need to be serialized
    // into your database.
    public int lastCustomerID;
    public int lastVendorID;
    public int lastProductID;
    public int lastTransactionID;

    // Updates last-ID variable and returns its value.
    public int NewID(ID.Type type)
    {
        switch (type)
        {
            case ID.Type.Customer:
                lastCustomerID++;
                return lastCustomerID;

            case ID.Type.Vendor:
                lastVendorID++;
                return lastVendorID;

            case ID.Type.Product:
                lastProductID++;
                return lastProductID;

            case ID.Type.Transaction:
                lastTransactionID++;
                return lastTransactionID;

            default:
                throw new ArgumentException("An invalid type was passed: " + type);
        }
    }

    private void AnyMethod()
    {
        // Generate new customer ID for new customer.
        int newCustomerID = NewID(ID.Type.Customer);

        // Now the ID is in a variable, and your last-ID variable is updated.
        // Be sure to serialize this data into your database, and deserialize
        // it when creating new instances.
    }
}