如何首先使用实体框架代码将C#int映射到SqlServer tinyint?

如何首先使用实体框架代码将C#int映射到SqlServer tinyint?,c#,entity-framework,C#,Entity Framework,我有一个POCO模型类和一个现有的DB表,这两个我都不能更改我使用的是Entity Framework 6和Fluent API 模型类的CountryId为“int”。但是,在数据库表中,CtryId是一个“tinyint” 我尝试使用 modelBuilder.Entity<Event>().Property(e => e.CountryId).HasColumnName("CtryId").HasColumnType("tinyint"); 如何首先使用实体框架代码将C

我有一个POCO模型类和一个现有的DB表,这两个我都不能更改我使用的是Entity Framework 6和Fluent API

模型类的CountryId为“int”。但是,在数据库表中,CtryId是一个“tinyint”

我尝试使用

modelBuilder.Entity<Event>().Property(e => e.CountryId).HasColumnName("CtryId").HasColumnType("tinyint");

如何首先使用实体框架代码将C#int映射到SqlServer tinyint?

在EF中,int32映射到数据库中的int。在本例中,
tinyint
映射到.NET framework中的
byte
。您应该在POCO模型中将您的
CountryId
更改为
byte
类型。

您可以使用
byte
列创建一个新的POCO类,并使用它代替旧的POCO类


您可以使用AutoMapper在更高层中使用的旧POCO类和存储库层中使用的新POCO类之间复制值以进行存储。

简短回答:您不能

映射“排列”如下所示

POCO上的属性应为“字节”

以及映射:

        this.Property(t => t.CountryId).HasColumnName("CtryId");
你必须遵守EF的规则

然而,好消息是你可以用一点魔法让它工作

既然你不想违约。。。。。你可以做一个变通办法

public byte JustForMappingCtryId{ get; set; }

[NotMapped]
public int CountryId
{ 
    get
    { 
        return Convert.ToInt32(this.JustForMappingCtryId);
    } 
    set
    {
        if(value > 8 || value < 0 )
        {
              throw new ArgumentOutOfRangeException("Must be 8 or less, and greater or equal to zero.");
        }
        //this.JustForMappingCtryId = value;  /* Uncomment this code.. to put back the setter... you'll have to do the conversion here (from the input int to the byte) of course..but the edited out code shows the intention */      
    }
}
并在CountryId上放置一个实体框架“ignore”属性。(以上被视为[未映射]。。或者使用Fluent方法指定忽略(上面的代码中未显示),但下面是面包屑:

 modelBuilder.Entity<MyEntity>().Ignore(c => c.MyPocoProperty);
modelBuilder.Entity().Ignore(c=>c.MyPocoProperty);

好了。这是一个变通方法,但应该适合您的需要。

为什么您不在C#中使用?“这两个我都不能更改”-您能找到可以更改您的模型以匹配DB的人吗,或者反之亦然?您的“核心”POCO模型是一个
部分
类吗?我有点困惑,为什么您不能更改DB或POCO。你能详细说明一下这个限制吗?在我看来,有人告诉你,“做这件事,但不要改变任何事情”,这似乎让你进退两难。我想知道,也许“无法改变”是武断的,一个好的论点可能会胜出。至于它不起作用的原因,.NET正试图防止您丢失数据,因为.NET int比DB tinyint拥有更大的值范围。用另一个模型类替换一个模型类难道不被视为“更改”吗?不,如果旧类位于引用的程序集中,则无法更改。OP很清楚,他们不能改变这个类,并不是说他们不能写更多的代码……是的,但是之前发布的其他答案和被否决的答案和这个建议一样有用。例如,@Zafar的答案并不排除用新类替换该类。我认为OP根本不清楚他们不能修改原始模型,但可以自由地用不同的模型替换它。这似乎更可能是因为他们坚持使用他们给出的模型,但这是一个不必要的限制。如果我想的话,我应该能够把一个小的映射到一个长的。还有很多其他无效映射不是静态强制的,您必须为它们编写业务逻辑。就像一根绳子的长度。映射到一个字节的问题是,现在我需要在代码中的任何地方重铸到一个int,因为很多事情都与int有关,而不是与字节有关。或者我必须写一个不必要的包装。来自EF设计师的错误呼叫。
public byte JustForMappingCtryId{ get; set; }

[NotMapped]
public int CountryId
{ 
    get
    { 
        return Convert.ToInt32(this.JustForMappingCtryId);
    } 
    set
    {
        if(value > 8 || value < 0 )
        {
              throw new ArgumentOutOfRangeException("Must be 8 or less, and greater or equal to zero.");
        }
        //this.JustForMappingCtryId = value;  /* Uncomment this code.. to put back the setter... you'll have to do the conversion here (from the input int to the byte) of course..but the edited out code shows the intention */      
    }
}
   this.Property(t => t.JustForMappingCtryId).HasColumnName("CtryId");
 modelBuilder.Entity<MyEntity>().Ignore(c => c.MyPocoProperty);