C# 自动递增属性不是关键帧
是否可以自动递增实体框架中不是主键的属性?我有一个类,它有一个ID,但也有一个序列号:C# 自动递增属性不是关键帧,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,是否可以自动递增实体框架中不是主键的属性?我有一个类,它有一个ID,但也有一个序列号: public class Maintenance { [Key] public int ID { get; set; } public int GroupID { get; set; } public int SerialNo { get; set; } } 我在GroupID和SerialNo上有一个索引,具有唯一的关系,使得一个组不可能有两个相同的序列号 我目前正在检查
public class Maintenance
{
[Key]
public int ID { get; set; }
public int GroupID { get; set; }
public int SerialNo { get; set; }
}
我在GroupID
和SerialNo
上有一个索引,具有唯一的关系,使得一个组不可能有两个相同的序列号
我目前正在检查该组中的.Max()
序列号。不过,如果序列号自动递增,我会喜欢它。这可能吗
我一直在寻找解决方案,但据我所知,使用entity framework不可能有两个自动递增列,而且自动递增列始终是PK列
有没有办法设置自动增量,或者有没有比使用Max()
更好的解决方案?使用Max()
我先用代码
澄清一下:我想保留ID作为主键,并在插入时计算序列号
更新:
我尝试在SerialNo
上使用[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
,这导致实体框架想要更改此属性的主键。我还尝试了[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
,它尝试在SerialNo
列中插入NULL,而[DatabaseGenerated(DatabaseGeneratedOption.None)]
尝试插入0,基本上什么也不做
请求的信息:
这是表格外观的一个示例:
|_ID_|_GroupID_|_SerialNo_|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
| 4 | 1 | 3 |
| 5 | 2 | 2 |
是的,您可以使用:
有关可能的数据批注的列表,请参阅。如果您使用的是sql server,请仔细阅读
所以我认为下面的代码可以编译,但在尝试迁移/创建数据库时会出现错误
您也可以像这样使用fluentapi方法
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);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().Property(a=>a.GroupID
).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity().Property(a=>a.SerialNo
).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
您好,谢谢您的链接。这将非常有帮助。使用DatabaseGenerationOption.Identity
将强制SerialNo
成为对象的主键,这不是我想要的。我想保留ID作为主键,并在插入时计算序列号。@RobinDorbell:我想保留ID作为主键,并在插入时计算序列号。
-这绝对有道理,但不是您要求的;-)。也许你可以给我们一些例子,看看你的行应该/可以是什么样子?它是DatabaseGeneratedOption
,而不是DatabaseGenerationOption
。@JoSmo:谢谢你的提示-我链接到的官方EF页面上的内容实际上也是错误的->我会给他们发一个便条…你找到解决方法了吗?我有同样的问题……不,对不起@Mike,我没有。我仍在使用.Max()
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);
}