Entity Framework Core неверный размер поля - PullRequest
0 голосов
/ 23 января 2019

Я работаю над приложением dotnet core 2.1 с ядром Entity Framework и SQL Server 2017 Express Edition. Я создал миграцию и сделал обновление, и все прошло гладко, однако, при запросе базы данных я заметил, что размер полей не был применен в соответствии с миграциями.

Как я могу это исправить в моей миграции?

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.CreateTable(
        name: "Fornecedor",
        columns: table => new
        {
            Id = table.Column<Guid>(nullable: false),
            IdSistemaAntigo = table.Column<string>(type: "varchar", maxLength: 32, nullable: false),
            Status = table.Column<int>(nullable: false),
            DataCadastro = table.Column<DateTime>(nullable: false),
            UltimaMovimentacao = table.Column<DateTime>(nullable: false),
            TipoPessoa = table.Column<int>(nullable: false),
            Nome = table.Column<string>(type: "varchar", maxLength: 100, nullable: false),
            Apelido = table.Column<string>(type: "varchar", maxLength: 100, nullable: true),
            Sexo = table.Column<int>(nullable: true),
            Cnpj = table.Column<string>(type: "varchar", maxLength: 14, nullable: false),
            InscricaoEstadual = table.Column<string>(type: "varchar", maxLength: 15, nullable: false),
            EstadoEmissorInscricaoEstadual = table.Column<string>(type: "varchar", maxLength: 2, nullable: false),
            InscricaoMunicipal = table.Column<string>(type: "varchar", maxLength: 20, nullable: false),
            Cpf = table.Column<string>(type: "varchar", maxLength: 11, nullable: false),
            Rg = table.Column<string>(type: "varchar", maxLength: 15, nullable: false),
            EstadoEmissorRg = table.Column<string>(type: "varchar", maxLength: 2, nullable: false)
        },
        constraints: table =>
        {
            table.PrimaryKey("PK_Fornecedor", x => x.Id);
        });

    migrationBuilder.CreateTable(
        name: "FornecedorEmail",
        columns: table => new
        {
            Id = table.Column<Guid>(nullable: false),
            IdSistemaAntigo = table.Column<string>(type: "varchar", maxLength: 32, nullable: false),
            Status = table.Column<int>(nullable: false),
            DataCadastro = table.Column<DateTime>(nullable: false),
            UltimaMovimentacao = table.Column<DateTime>(nullable: false),
            FornecedorId = table.Column<Guid>(nullable: false),
            EnderecoEmail = table.Column<string>(type: "varchar", maxLength: 254, nullable: false),
            NomeExibicao = table.Column<string>(type: "varchar", maxLength: 40, nullable: false)
        },
        constraints: table =>
        {
            table.PrimaryKey("PK_FornecedorEmail", x => x.Id);
            table.ForeignKey(
                name: "FK_FornecedorEmail_Fornecedor_FornecedorId",
                column: x => x.FornecedorId,
                principalTable: "Fornecedor",
                principalColumn: "Id",
                onDelete: ReferentialAction.Cascade);
        });

    migrationBuilder.CreateTable(
        name: "FornecedorEndereco",
        columns: table => new
        {
            Id = table.Column<Guid>(nullable: false),
            IdSistemaAntigo = table.Column<string>(type: "varchar", maxLength: 32, nullable: false),
            Status = table.Column<int>(nullable: false),
            DataCadastro = table.Column<DateTime>(nullable: false),
            UltimaMovimentacao = table.Column<DateTime>(nullable: false),
            TipoLogradouro = table.Column<string>(type: "varchar", maxLength: 72, nullable: false),
            Logradouro = table.Column<string>(type: "varchar", maxLength: 72, nullable: false),
            Numero = table.Column<string>(type: "varchar", maxLength: 6, nullable: false),
            Bairro = table.Column<string>(type: "varchar", maxLength: 72, nullable: false),
            Complemento = table.Column<string>(type: "varchar", maxLength: 72, nullable: false),
            Cidade = table.Column<string>(type: "varchar", maxLength: 72, nullable: false),
            Estado = table.Column<string>(type: "varchar", maxLength: 2, nullable: false),
            Pais = table.Column<string>(type: "varchar", maxLength: 2, nullable: false),
            Cep = table.Column<string>(type: "varchar", maxLength: 8, nullable: false),
            CodigoIbge = table.Column<string>(type: "varchar", maxLength: 7, nullable: false),
            Identificador = table.Column<string>(nullable: false),
            FornecedorId = table.Column<Guid>(nullable: false)
        },
        constraints: table =>
        {
            table.PrimaryKey("PK_FornecedorEndereco", x => x.Id);
            table.ForeignKey(
                name: "FK_FornecedorEndereco_Fornecedor_FornecedorId",
                column: x => x.FornecedorId,
                principalTable: "Fornecedor",
                principalColumn: "Id",
                onDelete: ReferentialAction.Cascade);
        });

    migrationBuilder.CreateTable(
        name: "FornecedorTelefone",
        columns: table => new
        {
            Id = table.Column<Guid>(nullable: false),
            IdSistemaAntigo = table.Column<string>(type: "varchar", maxLength: 32, nullable: false),
            Status = table.Column<int>(nullable: false),
            DataCadastro = table.Column<DateTime>(nullable: false),
            UltimaMovimentacao = table.Column<DateTime>(nullable: false),
            Ddi = table.Column<string>(type: "varchar", maxLength: 4, nullable: false),
            Ddd = table.Column<string>(type: "varchar", maxLength: 4, nullable: false),
            Telefone = table.Column<string>(type: "varchar", maxLength: 9, nullable: false),
            Ramal = table.Column<string>(type: "varchar", maxLength: 4, nullable: false),
            TipoTelefone = table.Column<string>(type: "varchar", maxLength: 1, nullable: false),
            Identificador = table.Column<string>(nullable: false),
            FornecedorId = table.Column<Guid>(nullable: false)
        },
        constraints: table =>
        {
            table.PrimaryKey("PK_FornecedorTelefone", x => x.Id);
            table.ForeignKey(
                name: "FK_FornecedorTelefone_Fornecedor_FornecedorId",
                column: x => x.FornecedorId,
                principalTable: "Fornecedor",
                principalColumn: "Id",
                onDelete: ReferentialAction.Cascade);
        });

    migrationBuilder.CreateIndex(
        name: "IX_FornecedorEmail_FornecedorId",
        table: "FornecedorEmail",
        column: "FornecedorId");

    migrationBuilder.CreateIndex(
        name: "IX_FornecedorEndereco_FornecedorId",
        table: "FornecedorEndereco",
        column: "FornecedorId");

    migrationBuilder.CreateIndex(
        name: "IX_FornecedorTelefone_FornecedorId",
        table: "FornecedorTelefone",
        column: "FornecedorId");
}

Неверный размер поля миграции

Это мой класс миграции

        public override void ConfigurarEntidade(EntityTypeBuilder<Fornecedor> builder)
    {
        builder.ToTable("Fornecedor");

        #region Configurações da Entidade

        builder.Property(fornecedor => fornecedor.TipoPessoa)
            .HasColumnType("varchar")
            .HasMaxLength(1)
            .IsRequired();

        builder.Property(fornecedor => fornecedor.Nome)
            .IsRequired()
            .HasColumnType("varchar")
            .HasMaxLength(Fornecedor.TamanhoNome);

        builder.Property(fornecedor => fornecedor.Apelido)
            .HasColumnType("varchar")
            .HasMaxLength(Fornecedor.TamanhoNome);

        builder.Property(fornecedor => fornecedor.Sexo)
            .IsRequired(false);

        builder.OwnsOne(fornecedor => fornecedor.Cnpj, cnpj =>
        {
            cnpj.Property(fornecedor => fornecedor.NumeroCnpj)
                .HasColumnType("varchar")
                .HasColumnName("Cnpj")
                .HasMaxLength(Cnpj.TamanhoCnpj)
                .IsRequired();

        });

        builder.OwnsOne(fornecedor => fornecedor.InscricaoEstadual, ie =>
        {
            ie.Property(fornecedor => fornecedor.NumeroInscricao)
                .HasColumnType("varchar")
                .HasColumnName("InscricaoEstadual")
                .HasMaxLength(InscricaoEstadual.TamanhoInscricaoEstadual)
                .IsRequired();

            ie.Property(fornecedor => fornecedor.EstadoEmissor)
                .HasColumnType("varchar")
                .HasColumnName("EstadoEmissorInscricaoEstadual")
                .HasMaxLength(InscricaoEstadual.TamanhoEstadoEmissor)
                .IsRequired();
        });

        builder.Property(fornecedor => fornecedor.InscricaoMunicipal)
            .HasColumnType("varchar")
            .HasColumnName("InscricaoMunicipal")
            .HasMaxLength(Fornecedor.TamanhoInscricaoMunicipal)
            .IsRequired();

        builder.OwnsOne(fornecedor => fornecedor.Cpf, cpf =>
        {
            cpf.Property(fornecedor => fornecedor.NumeroCpf)
                .HasColumnType("varchar")
                .HasColumnName("Cpf")
                .HasMaxLength(Cpf.TamanhoMaximoCpf)
                .IsRequired();
        });

        builder.OwnsOne(fornecedor => fornecedor.Rg, rg =>
        {
            rg.Property(fornecedor => fornecedor.NumeroRg)
                .HasColumnType("varchar")
                .HasColumnName("Rg")
                .HasMaxLength(Rg.TamanhoRg)
                .IsRequired();

            rg.Property(fornecedor => fornecedor.EstadoEmissor)
                .HasColumnType("varchar")
                .HasColumnName("EstadoEmissorRg")
                .HasMaxLength(Rg.TamanhoEstadoEmissor)
                .IsRequired();
        });


        builder.Ignore(fornecedor => fornecedor.DataNascimento);

        builder.Ignore(fornecedor => fornecedor.Imagem);

        #endregion

        #region Relacionamentos

        builder
            .HasMany(fornecedor => fornecedor.Emails)
            .WithOne(email => email.Fornecedor)
            .HasForeignKey(email => email.FornecedorId);

        builder
            .HasMany(fornecedor => fornecedor.Enderecos)
            .WithOne(endereco => endereco.Fornecedor)
            .HasForeignKey(endereco => endereco.FornecedorId);

        builder
            .HasMany(fornecedor => fornecedor.Telefones)
            .WithOne(telefone => telefone.Fornecedor)
            .HasForeignKey(telefone => telefone.FornecedorId);

        #endregion
    }

А это моя сущность

    public class Fornecedor : Entity
{
    public static readonly int TamanhoNome = 100;
    public static readonly int TamanhoApelido = 20;
    public static readonly int TamanhoInscricaoMunicipal = 20;
    public static readonly int TamanhoRg = 20;

    private string _nome;
    private string _nomeFantasia;

    public TipoPessoa TipoPessoa { get; private set; }

    public string Nome
    {
        get { return _nome; }
        private set { _nome = (value == null ? "" : value.RemoverEspacosDuplos().ToCapitalize().Trim()); }
    }

    public string Apelido
    {
        get { return _nomeFantasia; }
        private set { _nomeFantasia = (value == null ? "" : value.RemoverEspacosDuplos().ToCapitalize().Trim()); }
    }

    public Sexo? Sexo { get; private set; }

    public Cnpj Cnpj { get; private set; }

    public InscricaoEstadual InscricaoEstadual { get; private set; }

    public string InscricaoMunicipal { get; private set; }

    public Cpf Cpf { get; private set; }

    public Rg Rg { get; private set; }

    public DateTime? DataNascimento { get; private set; }

    public string Imagem { get; private set; }

    public Fornecedor() { }
}

Ответы [ 2 ]

0 голосов
/ 24 января 2019

О code .IsUnicode (false) code в моем code OnModelCreating code не работает.

builder.Property(fornecedor => fornecedor.Nome)
.IsRequired()
.HasColumnType("varchar")
.IsUnicode(false)
.HasMaxLength(Fornecedor.TamanhoNome);

Я смог решить проблему таким образом

builder.Property(fornecedor => fornecedor.Nome)
.IsRequired()
.HasColumnType($"varchar({Fornecedor.TamanhoNome})");
//.IsUnicode(false)
//.HasMaxLength(Fornecedor.TamanhoNome);

Что приводит к

IdSistemaAntigo = table.Column<string>(type: "varchar(32)", nullable: false),
0 голосов
/ 23 января 2019

Проблема в аргументе type: "varchar" для всех этих вызовов table.Column<string>.Когда этот параметр указан, maxLength и некоторые другие параметры игнорируются генератором SQL миграции.Поскольку предполагается, что type является фактическим типом базы данных, включая размер и другие ограничения, например varchar(100) и т. Д. Когда это просто varchar, SqlServer DDL обрабатывает его как varchar(1).

При этом вопрос заключается в том, что является причиной включения этого параметра.По соглашению он не включен (но тип отображаемой базы данных - nvarchar(maxLength)), поэтому его необходимо указать в сопоставлениях модели.

Это можно было сделать двумя способами.

Сначала применяется аннотация данных [Column(TypeName ="varchar")].Однако, если вы сделаете это, вы получите исключение при попытке создать миграцию, подобную этой

Тип данных 'varchar' не поддерживается в этой форме.Либо укажите длину явно в имени типа, например, как 'varchar (16)', либо удалите тип данных и используйте API, такие как HasMaxLength, чтобы позволить EF выбирать тип данных.

Так что этоне должно быть так, но второй способ использования .HasColumnType("varchar") свободно API.Когда вы делаете это, неожиданно миграция генерируется без каких-либо ошибок и содержит вышеупомянутый параметр.Я нахожу это поведение по меньшей мере противоречивым - оба должны бросить или оба должны успешно завершиться.

В любом случае, решение заключается в том, чтобы поместить максимальную длину в имя типа, например,

.HasColumnType("varchar(100)")

или лучше избегать.HasColumnType где это возможно.Например, сопоставлен ли string с varchar или nvarchar, зависит от атрибута isUnicode, который по умолчанию равен true.Следовательно, чтобы получить нужный тип базы данных varchar(maxLength), замените все

.HasColumnType("varchar")

в вашем OnModelCreating на

.IsUnicode(false)

и позвольте существующим вызовам .HasMaxLenght обрабатывать максимальную длину.И не забудьте восстановить миграцию.

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