代码第一个EF在ASP.NET核心Web API中的单个主键

时间:2018-03-14 20:40:10

标签: asp.net-core-mvc entity-framework-core

我正在使用外部库向我返回数据,该库中有很多字段,并且嵌套对象非常深入。

我的班级看起来像这样;

public class Dto
{
    public Dto(Val val)
    {
        Val = val;
    }

    [Key]
    public int Id { get; set; }

    public Val Value{ get; set; }
}

当尝试将更改保存到EF时,我得到了错误;

Cannot insert explicit value for identity column in table 'Value' when IDENTITY_INSERT is set to OFF.

查看迁移时,似乎已在Value对象中的一些属性上设置了主键。我看了看,但无法找到一种方法来停止迁移自动分配主键。我已经使用;

找到了上面例子中的内容
[Key]

属性并在OnModelCreating覆盖中添加了多个部分,但没有任何结果成功。

编辑以提供更多清晰度而不是示例。

    [DbContext(typeof(SummonerDtoContext))]
    [Migration("20180314210242_Migration8")]
    partial class Migration8
    {
        protected override void BuildTargetModel(ModelBuilder modelBuilder)
            {
#pragma warning disable 612, 618
            modelBuilder
                .HasAnnotation("ProductVersion", "2.0.2-rtm-10011")
                .HasAnnotation("SqlServer:ValueGenerationStrategy",     SqlServerValueGenerationStrategy.IdentityColumn);

            modelBuilder.Entity("LccWebAPI.Models.SummonerDto", b =>
                {
                    b.Property<int>("Id")
                        .ValueGeneratedOnAdd();

                    b.Property<long?>("SummonerId");

                    b.HasKey("Id");

                    b.HasIndex("SummonerId");

                    b.ToTable("Summoners");
                    });

                modelBuilder.Entity("RiotSharp.SummonerEndpoint.Summoner", b =>
                {
                    b.Property<long>("Id")
                        .ValueGeneratedOnAdd();

                    b.Property<long>("AccountId");

                    b.Property<long>("Level");

                    b.Property<string>("Name");

                    b.Property<int>("ProfileIconId");

                    b.Property<int>("Region");

                    b.Property<DateTime>("RevisionDate");

                    b.HasKey("Id");

                    b.ToTable("Summoner");
                });

            modelBuilder.Entity("LccWebAPI.Models.SummonerDto", b =>
                {
                    b.HasOne("RiotSharp.SummonerEndpoint.Summoner", "Summoner")
                        .WithMany()
                        .HasForeignKey("SummonerId");
                });
#pragma warning restore 612, 618
        }
    }
}

和我想要存储的实际数据对象;

public class SummonerDto
    {
        public SummonerDto(Summoner summoner)
        {
            Summoner = summoner;
        }

        public int Id { get; set; }

        public Summoner Summoner { get; set; }
    }

和我的背景;

public class SummonerDtoContext : DbContext
{
    public SummonerDtoContext(DbContextOptions<SummonerDtoContext> options)
        : base(options)
    { }

    public DbSet<SummonerDto> Summoners { get; set; }
}

我无权修改Summoner对象本身的内部以添加注释以将其忽略为键。

我无法修改的Summoner对象的模型结构;

public class Summoner : SummonerBase
{
    [JsonProperty("profileIconId")]
    public int ProfileIconId { get; set; }

    [JsonConverter(typeof(DateTimeConverterFromLong))]
    [JsonProperty("revisionDate")]
    public DateTime RevisionDate { get; set; }

    [JsonProperty("summonerLevel")]
    public long Level { get; set; }
}

基地;

public class SummonerBase
{
    public Region Region { get; set; }

    [JsonProperty("id")]
    public long Id { get; set; }

    public long AccountId { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }
}

编辑:已解决

经过3个小时试图解决这个问题后,我终于设法解决了这个问题,因为我无法直接注释模型,我之前尝试通过我的SummonerDto模型访问ID。相反,我直接接受它们并且它有效。

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

        modelBuilder.Entity<SummonerDto>()
            .HasKey(c => c.Id);

        modelBuilder.Entity<Summoner>().Property(x => x.Id).ValueGeneratedNever();
        modelBuilder.Entity<Summoner>().Property(x => x.ProfileIconId).ValueGeneratedNever();
        modelBuilder.Entity<SummonerBase>().Property(x => x.Id).ValueGeneratedNever();

        base.OnModelCreating(modelBuilder);
    }

0 个答案:

没有答案