47

我有一个具有 char 属性的对象:

public class Product
{
    public char Code
    {
        get;
        set;
    }
}

实体框架似乎无法映射字符(当我从模型对象创建数据库架构时,数据库中缺少此字段)。无论如何我可以使用流利的 API 映射字符(例如到字符串)吗?我不想更改模型对象,因为它们是旧共享库的一部分。

4

5 回答 5

75

Char不是实体框架的有效原始类型 = 实体框架不映射它。如果您检查CSDL 参考,您将看到有效类型的列表(char不在其中)。

数据库char(1)被翻译为stringSQL 到 CSDL 的翻译)。Char被描述为具有固定长度 1 的非 unicode 字符串

唯一丑陋的选项是使用字符串的第二个映射属性,而您的char非映射属性将只使用string[0]该属性。这只是 EF 中缺少一些简单类型映射或转换器的另一个示例。

于 2011-07-20T13:26:14.927 回答
31

在 Fluent API 中,您可以使用 HasColumnType 方法指定数据库列数据类型,如下所示:

modelBuilder.Entity<Product>()   
.Property(p => p.Code)   
.HasColumnType("char");

根据 Andre Artus在此处的回答,HasColumnType 在 EF4.1 中可用。

对于那些使用数据注释的人,ColumnAttribute 可以完成同样的事情。

[Column(TypeName="char")]
public string Code { get; set; }
于 2015-02-08T23:07:56.157 回答
2

[Column( TypeName = "char(1)" )]

适用于我的 EF 核心 3.1.4

于 2020-06-26T19:14:09.237 回答
1

我已经尝试了我想象的所有方法,我必须说,据我所知,公认的答案是解决 char 类型问题的唯一方法。

char类型不可用于 EntityFramework 。

Fluent API 包含在此限制中。

如果您尝试在char上放置Property(p => p.MyCharProperty)一个Exception

这意味着char属性不适用于 Fluent API 和 Attributes。

最简单的解决方案是这个(由 Ladislav Mrnka 提出)。

public class Product
{
    public char Code { get; set; }

    [Column("Code", TypeName="char")]
    [MaxLength(1)]
    public string CodeString
    {
         get { return Code.ToString(); }
         set { Code = value[0]; }
    }
}

请注意:您不能将属性设为私有、受保护或内部。必须公开

Fluent API 版本是这样的。

public class Product
{
    public char Code { get; set; }

    //We need the property but we will use the Fluent API to replace the attributes
    public string CodeString
    {
         get { return Code.ToString(); }
         set { Code = value[0]; }
    }
}

modelBuilder.Entity<Product>().Property(p => p.Code)
    .HasTypeName("char")
    .HasMaxLength(1)
于 2019-03-13T13:27:18.600 回答
0

仅出于测试目的,有其他方法可以解决此问题。暂时从设计模式使该字段不为空到空。有时它是受限制的 SQL Management Studio。(更改设置工具->选项->设计器->表数据库设计器->取消选中“防止保存需要创建表的更改”

于 2018-12-04T12:22:06.903 回答