如何使用实体框架 4.1 "code only"流畅 API 映射 char 属性?



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

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

实体框架似乎无法映射字符(当我从模型对象创建数据库模式时,该字段从数据库中丢失)。无论如何,我可以映射字符(例如到一个字符串)使用流畅的API?我不想更改模型对象,因为它们是遗留共享库的一部分。

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

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

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

在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; }

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

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

char类型在EntityFramework中不可用。

Fluent API包含在此限制中。

如果你试图将char放在Property(p => p.MyCharProperty)上,将会给你一个异常

这意味着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]; }
    }
}
注意:不能将属性设置为private、protected或internal。必须是public

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)

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

相关内容

  • 没有找到相关文章

最新更新