So ordnen Sie Spalten-und entity-Anwesen von unterschiedlichen Datentypen in entity framework code first
Bin ich mit Entity Framework 5 - Code-first.
Ich habe eine Datenbank, die ich am Anschluss an, der bereits seit einiger Zeit (ich wusste nicht, erstellen Sie Sie). Es gibt eine Tabelle namens T_Customers
. Es enthält eine Liste mit allen Kunden. Es hat die folgende Struktur (nur teilweise dargestellt):
Customer_id | numeric (5, 0) | auto increment | not null (not set as primary key)
FName | varchar(50) | not null
LName | varchar(50) | not null
Meine Customer
Klasse:
public class Customer : IEntity
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Meine IEntity
Schnittstelle:
public interface IEntity
{
int Id { get; set; }
}
Habe ich Folgendes in meiner Datenbank Kontext-Klasse:
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>();
}
}
Mein Kunde configuration-Klasse:
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");
}
}
Ich versuche konsequent zu sein in meiner entity-Deklarationen, muss ich alle IDs auf ganze zahlen. Diese Kunden-ID wird der Typ numeric in der Datenbank, und jetzt bin ich in Probleme laufen, wenn Sie versuchen, um return eine Liste mit allen Kunden. Wie kann ich die Karte aus einer Datenbank numerischen Typ in einen C# - integer-Typ? Ich bin nicht die änderung meiner Klasse, die ID auf null-Werte zulässt oder dezimal, meine IDs sind immer nicht-null-Werte zulässt und integer. Ich kann auch nicht die Datenbank ändern.
Den Fehler, bin ich immer:
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'.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Geben Sie einen numerischen Typ für die Spalte
Beim generieren der Datenbank, wird es schaffen numeric-Spalte mit Präzisions -
18,0
. Aber wenn Sie die Zuordnung zu vorhandenen Datenbank, es funktioniert gut mit5,0
numerische Spalte.5,0
bleiben wird. Wenn Sie neue Datenbank erstellen von code, dann wird in dieser Spalte haben Präzision18,0
. Also, wenn du schon Präzision5,0
Sie brauchen nicht, etwas zu ändern. BTW integer haben könnte Wert größer als 99999 ist, so ist es im Geist.Die einfachste Lösung ist die Verwendung einer anderen Feld zugeordnet werden, um das Datenbank-Feld, und die ID-Eigenschaft wird lese - /Schreibzugriff auf dieses Feld. So etwas wie dieses:
Karte dieses neuen Feldes zur Datenbank-Feld, mit
und der EF wird die Verwendung der Kunden-id-Feld, und der code kann gerne verwenden Sie die Ganzzahl-id-Feld.
Andere Möglichkeit, um herauszufinden, was der erste code sein sollte, ist zu den MS-EF-Powertools
http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d
Können Sie fügen Sie ein leeres Projekt mit der rechten Maustaste, EF-Reverse Engineering-code zunächst von der DB.
Sie oft (nicht immer) einen guten start an der Lösung.
Haben Sie versucht, mit Dezimalstellen?
wenn Sie besorgt sind Präzision, sollten Sie die Validierung für die POCO.
Gibt es auch einige interessante Anotation hacks die dir gefallen könnten.
http://geekswithblogs.net/danemorgridge/archive/2010/12/20/ef4-code-first-control-unicode-and-decimal-precision-scale-with.aspx
viel Glück
Können Sie konvertieren es in ein int mit: