首页 > 解决方案 > 具有阴影属性的种子对象

问题描述

我正在尝试使用 Entity Framework core 3.1 为使用阴影属性的对象播种,但是当我尝试创建迁移时,我得到:

The seed entity for entity type 'MyObject' cannot be added because there was no value provided for the required property 'Created'.

属性“Created”是在 OnModelCreating 中添加的影子属性,因此我无法在模型配置中访问它。Microsoft 文章Data Seeding说:“如果实体类型有任何处于影子状态的属性,则可以使用匿名类来提供值……”我也尝试过,但遇到了同样的错误。

这是我的配置:

protected override void OnModelCreating( ModelBuilder modelBuilder )
{
    // Tried this before and after the shadow properties, same error
    modelBuilder.ApplyConfiguration( new MyObjectConfiguration() );

    // Tried to seed here too instead of in the MyObjectConfiguration
    //modelBuilder.Entity<Brokerage>().HasData( new
                            //{
                                //Id = 1,
                                //Name = "A Really Cool Object",
                                //PhoneNumber = "1234567891"
                            //} );

    // Create shadow properties
    foreach ( var entityType in modelBuilder.Model.GetEntityTypes()
          .Where( e => typeof( IAuditable ).IsAssignableFrom( e.ClrType ) ) )
    {
        modelBuilder.Entity( entityType.ClrType )
            .Property<DateTime>( "Created" );

        modelBuilder.Entity( entityType.ClrType )
            .Property<DateTime>( "Modified" );

        modelBuilder.Entity( entityType.ClrType )
            .Property<string>( "CreatedBy" );

        modelBuilder.Entity( entityType.ClrType )
            .Property<string>( "ModifiedBy" );
    }

    base.OnModelCreating( modelBuilder );
}


public class BrokerageConfiguration : IEntityTypeConfiguration<MyObject>
{
    public void Configure( EntityTypeBuilder<MyObject> builder )
    {
        ...

        //builder.Entity<MyObject>()
        //    .HasData( new { Id = 1, Name = "A Really Cool Object", PhoneNumber = "1234567891" } );

        builder.HasData
        (
            new MyObject
            {
                Id = 1,
                Name = "A Really Cool Object",
                PhoneNumber = "1234567891"
            }
        );
    }
}

如何播种使用阴影属性的数据?

标签: c#entity-framework-coreseed

解决方案


为了完整起见(因为我自己正在寻找解决方案),使用匿名类将是上面评论的解决方案:

modelBuilder.Entity<Brokerage>().HasData(new
{
    Id = 1,
    Name = "A Really Cool Object",
    PhoneNumber = "1234567891",
    CreatedBy = "sysdba",
    Created = DateTime.Now,
    ModifiedBy = "sysdba",
    Modified = DateTime.Now
});

推荐阅读