Entity Framework 6中的DatabaseGeneratedOption.None无法正常工作

4
我需要在数据库中手动输入主键值,因为我需要将主键值与枚举同步。然而,使用DatabaseGeneratedoption.None似乎不起作用。即使我删除数据库并重新开始,JobType中的Id列仍具有自动递增的主键。
这与我使用枚举作为主键有关吗?
职位实体
public class Job : EntityBase
{
    public long JobId { get; set; }       
    public JobTypeEnum JobTypeId { get; set; }
    public JobType JobType { get; set; }      
}

工作类型

public class JobType 
{         
    public JobTypeEnum Id { get; set; }
    public String Name { get; set; }
    public String Description { get; set; }       
}

配置类

public class JobTypeConfiguration : EntityTypeConfiguration<JobType>
{
    public JobTypeConfiguration()
    {
        HasKey(x => x.Id);
        Property(x => x.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        Property(x => x.Name).HasMaxLength(20);
        Property(x => x.Description).HasMaxLength(255);
    }
}

public class JobConfiguration : EntityTypeConfiguration<Job>
{
    public JobConfiguration()
    {
        HasKey(x => x.JobId);
        Property(x => x.JobId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);          
         HasRequired(x => x.JobType).WithMany().HasForeignKey(x => x.JobTypeId);

    }
}

模型构建器

modelBuilder.Configurations.Add(new JobConfiguration());
modelBuilder.Configurations.Add(new JobTypeConfiguration());

编辑:

我找到了一个可能的原因。我有一个迁移,用于创建 Elmah 的表格。如果我排除该迁移,那么一切都正常。如果我包括它,那么就会出问题。

真是奇怪...

1个回答

2

我已经将您的代码添加到我的项目中。这是生成的迁移代码:

    public override void Up()
    {
        CreateTable(
            "dbo.Jobs",
            c => new
                {
                    JobId = c.Long(nullable: false, identity: true),
                    JobTypeId = c.Int(nullable: false),
                })
            .PrimaryKey(t => t.JobId)
            .ForeignKey("dbo.JobTypes", t => t.JobTypeId, cascadeDelete: true)
            .Index(t => t.JobTypeId);

        CreateTable(
            "dbo.JobTypes",
            c => new
                {
                    Id = c.Int(nullable: false),
                    Name = c.String(maxLength: 20),
                    Description = c.String(maxLength: 255),
                })
            .PrimaryKey(t => t.Id);


    }

你可以看到dbo.JobTypes表没有设置identity: true。你可能会发现自己遇到了这里描述的问题:如何将列从DatabaseGenerated.Identity更改为DatabaseGenerated.None
最简单的方法可能是找到JobTypeCreateTable语句,进行修复,然后重新创建数据库。

谢谢,但正如在原帖中所说的那样,当我删除并重新创建数据库时也会出现这种情况。 - MrBliz
1
你能发布一下Up Migration中的CreateTable语句吗?是否有在后续Migration中有ALTER TABLE语句? - Colin
我目前正在使用自动迁移。 - MrBliz
我想我已经找到了问题所在。我更新了问题,但这可能对任何人都没有用……感谢您的帮助。 - MrBliz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接