是否可以自动递增 属性 而不是 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.
}
}
是否可以在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.
}
}