2013-02-11 6 views
7

私はEntity Framework 5 - コードを使用しています。エンティティフレームワークコードの異なるデータ型の列とエンティティのプロパティを最初にマップする方法

私は接続しているデータベースがありますが、これは既に存在しています(作成していません)。 T_Customersという表があります。それはすべての顧客のリストを含んでいます。これは、(部分的にしか示さ)以下の構造を有する:

Customer_id | numeric (5, 0) | auto increment | not null (not set as primary key) 
FName | varchar(50) | not null 
LName | varchar(50) | not null 

マイCustomerクラス:

public class Customer : IEntity 
{ 
    public int Id { get; set; } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 
} 

マイIEntityインターフェース:私は私のデータベースのコンテキストクラスに次のように持って

public interface IEntity 
{ 
    int Id { get; set; } 
} 

public class DatabaseContext : DbContext 
{ 
    public DatabaseContext(string connectionString) 
      : base(connectionString) 
    { 
    } 

    public DbSet<Customer> Customers { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
      modelBuilder.Configurations.Add(new CustomerConfiguration()); 
    } 

    public new DbSet<TEntity> Set<TEntity>() 
      where TEntity : class, IEntity 
    { 
      return base.Set<TEntity>(); 
    } 
} 

私の顧客の設定クラス:

class CustomerConfiguration : EntityTypeConfiguration<Customer> 
{ 
    internal CustomerConfiguration() 
    { 
      this.ToTable("T_Customers"); 
      this.Property(x => x.Id).HasColumnName("Customer_id"); 
      this.Property(x => x.FirstName).HasColumnName("FName"); 
      this.Property(x => x.LastName).HasColumnName("LName"); 
    } 
} 

私は実体宣言で矛盾しないようにしようとしている、私はすべてのIDが整数である必要があります。この顧客IDはデータベース内の数値型で、すべての顧客のリストを返すときに問題に遭遇しています。データベース数値型からC#整数型にマップするにはどうすればよいですか?私はクラスのIDをnullableまたは10進数に変更していません。私のIDは常にnullでもなく整数です。私もデータベースを変更することはできません。

私は取得していますエラーは次のとおりです。

The 'Id' property on 'Customer' could not be set to a 'Decimal' value. 
You must set this property to a non-null value of type 'Int32'. 

答えて

6

は、データベースを生成するとき、それは正確18,0と数値列を作成する列

Property(x => x.Id).HasColumnName("Customer_id").HasColumnType("numeric"); 

のための数値型を指定します。しかし、既存のデータベースにマッピングしているときは、5,0数値カラムで正常に動作します。

+0

ありがとう。 18、0と異なる精度が必要な場合はどうなりますか? 5,0の精度にこだわる方が良いですか? –

+0

@BrendanVogtまあ、あなたはすでにデータベースがあると言ったので、精度は '5,0 'にとどまります。コードから新しいデータベースを生成する場合、この列の精度は「18,0」になります。したがって、すでに精度が「5,0」の場合は、何も変更する必要はありません。 BTW整数は99999より大きい値を持つ可能性があるので、心に留めておいてください。 –

+1

ありがとう!これは私の一日を作った。 – tuseau

-2

あなたがしてint型に変換することができます:最も簡単な解決策がデータベースにマッピングされる別のフィールドを使用することです

int myInt = Convert.Int32(numberFromDatabase); 
3

IDプロパティはこのフィールドを読み書きします。このような何か:

public class Customer : IEntity 
{ 
    public decimal CustomerID {get; set;} 

    [NotMapped] 
    public int Id 
    { 
     get { return (int)CustomerID; } 
     set { CustomerID = (int)value; } 
    } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 
} 

this.Property(x => x.CustomerID).HasColumnName("Customer_id"); 

を使用して、データベースフィールドに、この新しいフィールドの地図とEFは、顧客IDフィールドを使用し、あなたのコードは喜んで整数のidフィールドを使用することができます。

-1

コードが最初にあるべきかを作業する別のオプションは、MS EFのPowerToolsに http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d

であるあなたは、空のプロジェクトを追加するには、右DBから最初、EFリバースエンジニアコードをクリックすることができます。

多くの場合(必ずしもそうではありませんが)、ソリューションを開始することがよくあります。 10進数を試しましたか?

public class Customer : IEntity 
{ 
public decimal Id { get; set; } 

public string FirstName { get; set; } 

public string LastName { get; set; } 
} 

精度が問題となる場合は、POCOに検証を追加する必要があります。

興味深いAnotationハッキングもあります。 http://geekswithblogs.net/danemorgridge/archive/2010/12/20/ef4-code-first-control-unicode-and-decimal-precision-scale-with.aspx 幸運