【问题标题】:Mapping with enumerator [duplicate]用枚举器映射[重复]
【发布时间】:2015-12-30 17:17:09
【问题描述】:

我有一张表,其中有一列 char(2)

CREATE TABLE COMPANY (
    EMP_ID            INTEGER NOT NULL,
    EMP_TYPE          CHAR(2) NOT NULL,
    EMP_NM            VARCHAR(35) NOT NULL
);

使用实体框架,我想用枚举映射实体。

public class Company
{
    public Company ()
    {
        Id = null;
        Type = Enums.EnumType.TipoCompany.Matriz;
        Name = string.Empty;
    }

    public int? Id{ get; set; }
    public string Name{ get; set; }
    public Enums.EnumType.TipoCompany TipoCompany { get; set; }
}

public class CompanyMap : EntityTypeConfiguration<Company>
{
    public CompanyMap()
    {
        ToTable("COMPANY");

        HasKey(t => new { t.Id});

        Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).HasColumnName("EMP_ID");

        Property(t => t.Name)
            .IsRequired()
            .HasMaxLength(35)
            .HasColumnType("Varchar")
            .HasColumnName("EMP_NM");

        Property(t => t.TypeCompany)
          .IsRequired()
          .HasColumnType("Varchar")
          .HasColumnName("EMP_TYPE");
    }
}

public class EnumTypeCompany
{
    public enum TypeCompany
    {
        [Description("Matriz")]
        Matriz = 01,
        [Description("Filial")]
        Filial = 02,
    }
}

我收到了错误:

Contexto.Type[Nullable=False,DefaultValue=]' of member 'TypoCompany' in type 'Contexto.Company' is not compatible with 'FirebirdClient.varchar

如何将varchar转为枚举???

【问题讨论】:

  • "如何将varchar转为枚举???"你不能。你的问题是我如何将string 映射到int
  • 对不起,我问错了,因为在Java中我会创建一个转换类,它将从数据库中获取结果并变成枚举

标签: c# entity-framework


【解决方案1】:

如果您对 EMP_TYPE 字段使用 int 而不是 varchar,则应该可以解决问题。 当您从数据库中获取数据时,int 字段将自动转换为您的枚举。

更新

public class Company
{
    public Company ()
    {
        Id = null;
        TipoCompanyString = ((int)Enums.EnumType.TipoCompany.Matriz).ToString();
        TipoCompany = Enums.EnumType.TipoCompany.Matriz;
        Name = string.Empty;
    }

    public int? Id { get; set; }
    public string Name { get; set; }
    public string TipoCompanyString { get; set; }
    public Enums.EnumType.TipoCompany TipoCompany { 
        get {
            var intValue = Convert.ToInt32(TipoCompanyString);
            return (Enums.EnumType.TipoCompany)intValue;
        }
        set {
            TipoCompanyString = ((int)value).ToString()
        }
    }
}

public class CompanyMap : EntityTypeConfiguration<Company>
{
    public CompanyMap()
    {
        ToTable("COMPANY");

        HasKey(t => new { t.Id});

        Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).HasColumnName("EMP_ID");

        Property(t => t.Name)
            .IsRequired()
            .HasMaxLength(35)
            .HasColumnType("Varchar")
            .HasColumnName("EMP_NM");

        Property(t => t.TipoCompanyString)
            .IsRequired()
            .HasColumnType("Varchar")
            .HasColumnName("EMP_TYPE");
    }
}

public class EnumTypeCompany
{
    public enum TypeCompany
    {
        [Description("Matriz")]
        Matriz = 01,
        [Description("Filial")]
        Filial = 02,
    }
}

【讨论】:

  • 你确定吗?
  • @manetsus 是的,这是真的
  • 它可以工作,但我无法更改我的数据库
  • 创建一个新的字符串属性并映射它而不是TypeCompany。在TypeCompany 中,get 和 set 必须将新的字符串属性强制转换为枚举。 get { var intValue = Convert.ToInt32(newStringProperty); return (Enums.EnumType.TipoCompany)intValue; }。这应该可以解决问题。
  • 我发布了完整的代码。让我知道它是否适合您。
【解决方案2】:

在c#中你不能有enum:string,只有intbyte等。你可以做一个“假”枚举:

public static class FakeEnum
{
  public static readonly OptionOne = "blabla";
  public static readonly OptionTwo = "random";
}

字符串值将是您数据库中EMP_TYPE 字段的值。 您可以像使用字符串枚举一样使用它,例如在检查中:

Company company = db.Companies.First();
if(company.Type == FakeEnum.OptionOne) //company.Type is really "blabla" in db
  DoStuff();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2017-03-03
    相关资源
    最近更新 更多