10

私はEntityFramework5-コードを最初に使用しています。

接続しているデータベースがあり、それはすでにしばらくの間存在しています(私はそれを作成しませんでした)。と呼ばれるテーブルがあります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をnull許容または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'.
4

5 に答える 5

7

列の数値型を指定します

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

データベースを生成するときに、精度の高い数値列を作成します18,0。ただし、既存のデータベースにマッピングする場合は、5,0数値列で正常に機能します。

于 2013-02-11T13:32:23.870 に答える
4

最も簡単な解決策は、データベースフィールドにマップされる別のフィールドを使用することであり、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フィールドを問題なく使用できます。

于 2013-02-11T13:09:44.117 に答える
0

.Net Coreでは、System.ComponentModel.DataAnnotations.Schema.ColumnAttributeを使用して、基になる列タイプでプロパティに注釈を付けることもできます。

    [Column(TypeName = "numeric(5, 0), not null")]
    public int Id { get; set; }

または、列がnull許容の場合:

    [Column(TypeName = "numeric(5, 0), null")]
    public int? Id { get; set; }

@Sergey Berezovskiyが受け入れた回答よりも、これを好みます。アノテーションは、他の場所(DbContext内)ではなく、実際にモデルに作成するためです。

ColumnAttributeを使用して、プロパティを別の名前の列にマップすることもできます。

    [Column("Identifier", TypeName = "numeric(5, 0), not null")]
    public int Id { get; set; }

ColumnAttributeは.NetFrameworkでも機能する可能性があります-私はそれをテストしていません。

于 2020-11-13T09:58:59.590 に答える
-1

コードが最初にどうあるべきかを理解するための別のオプションは、MS EFPowertoolshttp://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19dです

空のプロジェクトを追加し、右クリックして、最初にDBからEFリバースエンジニアリングコードを追加できます。

多くの場合(常にではありませんが)、ソリューションの良いスタートを切ることができます。小数を使ってみましたか?

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

 public string FirstName { get; set; }

 public string LastName { get; set; }
}

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

あなたが好きかもしれないいくつかの興味深い注釈ハックもあります。 http://geekswithblogs.net/danemorgridge/archive/2010/12/20/ef4-code-first-control-unicode-and-decimal-precision-scale-with.aspx 幸運

于 2013-02-11T13:48:17.747 に答える
-2

次のコマンドでintに変換できます。

 int myInt = Convert.Int32(numberFromDatabase);
于 2013-02-11T13:07:35.763 に答える