Entity Framework Core сгенерированный автоматически - PullRequest
0 голосов
/ 27 ноября 2018

Может ли кто-нибудь Один направить меня, я хочу primeryKey таблицы как guid с созданным значением db на вставке.

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }

, но этодавая error

Начальный объект для типа объекта "Пользователь" не может быть добавлен, поскольку для требуемого свойства "Id" не было предоставлено значение.

Здесьмои действительные классы моделей и класс DbContxt:

public class BaseModel
{
     [Key]
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
     public Guid Id { get; set; }

     [Required]
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
     public DateTime CreatedOn { get; set; } = DateTime.UtcNow;


     [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
     public DateTime? UpdatedOn { get; set; }

     [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
     public DateTime LastAccessed { get; set; }
 }

 public class User : BaseModel
 {
        [Required]
        [MinLength(3)]
        public string Name { get; set; }

        [Required]
        [MinLength(3)]
        [EmailAddress]
        public string Email { get; set; }

        [Required]
        [MinLength(6)]
        public string Password { get; set; }
  }

Затем в DbContxt:

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

        protected override void OnModelCreating(ModelBuilder mb)
        {
            base.OnModelCreating(mb);

            mb.Entity<User>().HasData(
                new User() { Email = "Mubeen@gmail.com", Name = "Mubeen", Password = "123123" },
                new User() { Email = "Tahir@gmail.com", Name = "Tahir", Password = "321321" },
                new User() { Email = "Cheema@gmail.com", Name = "Cheema", Password = "123321" }
                );
        }

        public DbSet<User> User { get; set; }
    }

Любая помощь, пожалуйста!

Ответы [ 6 ]

0 голосов
/ 20 августа 2019
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
        {
            b.Property<string>("Id").HasMaxLength(36)
                .ValueGeneratedOnAdd();
});
0 голосов
/ 15 мая 2019

Вместо того, чтобы вручную обновлять миграцию, вы также можете внедрить обновление в OnModelCreating, которое добавляет его в миграцию для вас, например,

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // guid identities
    foreach (var entity in modelBuilder.Model.GetEntityTypes()
        .Where(t =>
            t.ClrType.GetProperties()
                .Any(p => p.CustomAttributes.Any(a => a.AttributeType == typeof(DatabaseGeneratedAttribute)))))
    {
        foreach (var property in entity.ClrType.GetProperties()
            .Where(p => p.PropertyType == typeof(Guid) && p.CustomAttributes.Any(a => a.AttributeType == typeof(DatabaseGeneratedAttribute))))
        {
            modelBuilder
                .Entity(entity.ClrType)
                .Property(property.Name)
                .HasDefaultValueSql("newsequentialid()");
        }
    }

}  
0 голосов
/ 27 ноября 2018

Проблема, с которой вы столкнулись, не относится к автоматически сгенерированным гидам.То же самое происходит для любых автоматически сгенерированных значений ключа, включая обычно используемые столбцы с автоприращением (идентификатором).

Это вызвано определенным заполнением данных (HasData)требование:

Этот тип начальных данных управляется миграциями, и необходимо создать сценарий для обновления данных, уже находящихся в базе данных, без подключения к базе данных.Это накладывает некоторые ограничения:

  • Значение первичного ключа необходимо указывать, даже если оно обычно генерируется базой данных.Он будет использоваться для обнаружения изменений данных между миграциями.
  • Ранее заполненные данные будут удалены при любом изменении первичного ключа.

Обратите внимание на первый пункт.Таким образом, в то время как для обычного CRUD ваш PK будет сгенерирован автоматически, вы должны требовать , чтобы указать его при использовании HasData свободный API, и значение должно быть постоянным (не изменяющимся), поэтому вы не можете использовать Guid.NewGuid().Поэтому вам нужно сгенерировать несколько Guids, взять их строковое представление и использовать что-то вроде этого:

mb.Entity<User>().HasData(
    new User() { Id = new Guid("pre generated value 1"), ... },
    new User() { Id = new Guid("pre generated value 2"), ... },
    new User() { Id = new Guid("pre generated value 3"), ... }
    );
0 голосов
/ 27 ноября 2018

Вы можете использовать defaultValueSql: "newid()" в вашем файле Code First Migration.

Например;

 public override void Up()
    {
        CreateTable(
            "dbo.ExampleTable",
            c => new
            {
                Id = c.Guid(nullable: false, identity: true, defaultValueSql: "newid()"),               
                RowGuid = c.Guid(nullable: false, defaultValueSql: "newid()"),

            })
            .PrimaryKey(t => t.Id);           
    }
0 голосов
/ 27 ноября 2018

GUID обрабатывается Identity framework, а не EF, поэтому для использования GUID необходимо сделать следующее

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

, а затем подготовить модель перед вставкой в ​​таблицу

new User() { Id = Guid.NewGuid(), Email = "Mubeen@gmail.com", Name = "Mubeen", Password = "123123" },
0 голосов
/ 27 ноября 2018

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] в поле GUID работает в Entity Framework 6.x, может быть еще не в EF Core!

Итак, решение:

1) Сначала напишите BaseModelКласс выглядит следующим образом:

public class BaseModel
{
    [Key]
    public Guid Id { get; set; }

    public DateTime CreatedOn { get; set; } = DateTime.UtcNow;

    public DateTime? UpdatedOn { get; set; }

    public DateTime LastAccessed { get; set; }
}

2) Тогда метод OnModelCreating() в вашем DbContext должен выглядеть следующим образом:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
      base.OnModelCreating(modelBuilder);

      modelBuilder.Entity<YourEntity>().Property(x => x.Id).HasDefaultValueSql("NEWID()");

      modelBuilder.Entity<User>().HasData(
            new User() { Id  = Guid.NewGuid(), Email = "Mubeen@gmail.com", Name = "Mubeen", Password = "123123" },
            new User() { Id = Guid.NewGuid(), Email = "Tahir@gmail.com", Name = "Tahir", Password = "321321" },
            new User() { Id = Guid.NewGuid(),  Email = "Cheema@gmail.com", Name = "Cheema", Password = "123321" }
            );
 }

Теперь создайте новую миграцию и обновите базу данных соответственно,Надеюсь, что ваша проблема будет решена!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...