Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动递增属性不是关键帧_C#_Entity Framework_Ef Code First - Fatal编程技术网

C# 自动递增属性不是关键帧

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上有一个索引,具有唯一的关系,使得一个组不可能有两个相同的序列号 我目前正在检查

是否可以自动递增实体框架中不是主键的属性?我有一个类,它有一个ID,但也有一个序列号:

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