为什么EF 6.1.3会继续生成字符串值为Unicode?

时间:2016-06-22 14:43:45

标签: c# entity-framework

我定义了以下类:

private class Entity
{
    public int? Number { get; set; }
    [Column(TypeName = "VARCHAR")]
    [StringLength(50)]
    public string Type { get; set; }
    public int Id { get; set; }
    [Column(TypeName = "VARCHAR")]
    [StringLength(255)]
    public string Name { get; set; }
}

Entity不是数据库中存在的Model类,而是我想将输出映射到它而不是匿名类型。

public static class EntityTypeName
{
    public const string Dealer = "DEALER";
}

稍后,在我的代码中,我有以下实体框架查询:

IRepository<DealerMostCurrent> repoDealer = new Repository<DealerMostCurrent>(context);
IRepository<DealerContact> repoDealerContact = new Repository<DealerContact>(context);
IQueryable<Entity> dealerEntity;

dealerEntity = from dealerRow in repoDealer.GetAsQueryable(dealerWhere).AsNoTracking()
               join dealerContactRow in repoDealerContact.GetAsQueryable(dealerContactWhere).AsNoTracking() on dealerRow.Dealer_Number equals dealerContactRow.Dealer_Number
    group dealerRow by new 
    {
        dealerRow.Dealer_Number,
        dealerRow.Dealer_Id,
        dealerRow.Dealer_Name
    } into groupedDealers
    select new Entity()
    {
        Number = groupedDealers.Key.Dealer_Number,
        Type = EntityItem.EntityTypeName.Dealer,
        Id = groupedDealers.Key.Dealer_Id,
        Name = groupedDealers.Key.Dealer_Name
    };

如果我查看为EF调用生成的SQL,我会看到实体框架正在转换我的EntityItem.EntityTypeName.Dealer常量,该常量被定义为StringN'DEALER' AS [C1]

SELECT 
[Distinct1].[Dealer_Id] AS [Dealer_Id], 
[Distinct1].[Dealer_Number] AS [Dealer_Number], 
N'DEALER' AS [C1], 
[Distinct1].[Dealer_Name] AS [Dealer_Name]
FROM ( SELECT DISTINCT 
    [Extent1].[Dealer_Id] AS [Dealer_Id], 
    [Extent1].[Dealer_Number] AS [Dealer_Number], 
    [Extent1].[Dealer_Name] AS [Dealer_Name]
    FROM  [dbo].[DealerMostCurrent] AS [Extent1]
    INNER JOIN [dbo].[DealerContact] AS [Extent2] ON [Extent1].[Dealer_Number] = [Extent2].[Dealer_Number]
    WHERE ([Extent1].[Dealer_Id] > 0) AND ([Extent2].[Contact_Id] IN (1473,1475,1477,1481))
)  AS [Distinct1]

似乎EntityFramework忽略了我的输出映射类中的[Column(TypeName = "VARCHAR")。如果我明确告诉实体框架Type = System.Data.Entity.DbFunctions.AsNonUnicode(EntityItem.EntityTypeName.Dealer)那么一切都很好,字符串不是对Unicode的类型转换。我在这里错过了什么吗?

此外,在我的OnModelCreating中,我认为执行以下操作会明确强制EntityFramework将所有字符串类型视为非Unicode。

modelBuilder.Properties<string>().Configure(p => p.IsUnicode(false));

我错过了哪些难题或误解。 如何强制EntityFramework将所有.NET String类型视为非Unicode ?我宁愿不必查看我的所有代码,并在我设置常量字符串值的所有位置添加System.Data.Entity.DbFunctions.AsNonUnicode

0 个答案:

没有答案