EFCore插入在电子邮件字符串列的中间放置一个奇怪的(??)值

问题描述 投票:1回答:1

EFCore为电子邮件列保存了错误的值。

例如:该属性类具有字符串值:“ [email protected]”但是,当我检查存储的值时(无论是在SQL Server中还是使用EFCore获取对象)是:“ [email protected] ??。br。

??在原始电子邮件值中不存在。

我已直接插入数据库中,但不会发生此问题。

复制步骤尝试使用EFCore进行简单插入,如下所示:

来自我的存储库类的insert方法:

public void Insert(T entity)
{
       DbContext.Set<T>().Add(entity);
       DbContext.SaveChanges();
}

我的映射实体类:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using DataImoveis.Domain.Entities.Abstraction;

namespace DataImoveis.Domain.Entities
{
    [Table("SIL_IMOVEL_INQUILINO")]
    public class ImovelInquilino : BaseEntity
    {
        [Key]
        [Column("cod")]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Cod { get; set; }

        [Column("propertyId")]
        public int PropertyId { get; set; }

        [Column("lastUpdatedDate")]
        public DateTime LastUpdatedDate { get; set; }

        [Column("tenantName")]
        public string TenantName { get; set; }

        [Column("tenantContact")]
        public string TenantContact { get; set; }

        [Column("tenantEmail")]
        public string TenantEmail { get; set; }

        [Column("tenantPhone")]
        public string TenantPhone { get; set; }

        [Column("tenantIndustry")]
        public string TenantIndustry { get; set; }
    }
}

我的DbContext类:

using DataImoveis.Domain.Entities;
using DataImoveis.Domain.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.Extensions.Options;

namespace DataImoveis.Infrastructure
{
    public class DbContext : Microsoft.EntityFrameworkCore.DbContext
    {
        public virtual DbSet<ImovelInquilino> ImovelInquilino { get; set; }

        private IOptions<Settings> settings;

        public override DatabaseFacade Database { get { return base.Database; } }

        public DbContext(IOptions<Settings> settings) : base() =>
            this.settings = settings;

        protected override void OnConfiguring(
            DbContextOptionsBuilder optionsBuilder
        )
        {
            optionsBuilder.UseSqlServer(
                settings.Value.ConnectionStrings.DefaultConnection
            );
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder) { }

    }
}

数据库中的列详细信息:

[tenantEmail] [varchar](70) NULL,

此字段没有触发器或以后的更新。

我启用了DbContext操作的日志记录功能,以检查从EFCore发送到数据库的参数,并且我认为一切正常:

Executed DbCommand (24ms) [Parameters=[(...) @p14='[email protected]​​.br.' (...)]

更多技术细节EF核心版本:3.1.4数据库提供程序:Microsoft.EntityFrameworkCore.SqlServer 3.1.3数据库:SQL Server 2019目标框架:.NET Core 3.1操作系统:在Ubuntu 18.04(在WSL2)或Windows 10上IDE:VSCode

c# sql-server entity-framework .net-core entity-framework-core
1个回答
0
投票

您的电子邮件地址的'com'和'.br。之间有两个Unitode字符'ZERO WIDTH SPACE'(E2 80 8B)。 (我将您的日志中的文本复制到文本文件中,进行保存,然后查看十六进制表示形式:

enter image description here

由于DB列是varchar,所以这些unicode字符不能按原样保存在DB中,并且DB会将它们转换为占位符'?'。

要么将DB列定义为nvarchar(所有Unicode字符都将按原样存储),或从输入数据中删除此类字符。

© www.soinside.com 2019 - 2024. All rights reserved.