自动增量属性不是键

时间:2015-01-09 09:55:39

标签: c# entity-framework ef-code-first

是否可以自动增加不是Entity Framework中主键的属性?我所拥有的是一个具有ID但又有序列号的类:

public class Maintenance
{
    [Key]
    public int ID { get; set; }
    public int GroupID { get; set; }
    public int SerialNo { get; set; } 
}

我的GroupIDSerialNo索引具有唯一关系,因此组无法使用相同的序列号两次。

我目前正在检查该群组中.Max()的{​​{1}}。如果序列号自动递增,我会喜欢它。这可能吗?

我一直在寻找解决方案,但就我所知,它不可能有2个自动递增列与实体框架,并且自动递增列将始终是PK列。

有没有办法设置自动增量,还是比使用SerialNo有更好的解决方案?使用Max()理论上可能会产生2个相同的值,并且会在尝试插入时导致程序崩溃(因为唯一索引)。

我先使用代码。

澄清:我想将ID作为主键,并在插入时计算序列号。

更新:

我尝试在Max()上使用[DatabaseGenerated(DatabaseGeneratedOption.Identity)],导致实体框架想要将主键更改为此属性。我还尝试SerialNo尝试在[DatabaseGenerated(DatabaseGeneratedOption.Computed)]列中插入NULL,尝试插入0 SerialNo,基本上做'没事'。

请求信息:

这是表格外观的一个例子:

[DatabaseGenerated(DatabaseGeneratedOption.None)]

2 个答案:

答案 0 :(得分:7)

是的,您可以使用following attribute

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

请参阅HERE以获取可能的数据注释列表。

答案 1 :(得分:1)

如果您使用的是sql server,请仔细阅读

Can we have more than one identity columns in a table.


所以我想下面的代码编译,但在尝试迁移/创建数据库时会给你一个错误。

你也可以像这样使用流利的api approch

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Maintenance>().Property(a => a.GroupID 
                          ).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    modelBuilder.Entity<Maintenance>().Property(a => a.SerialNo 
                          ).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}