2013-08-07 54 views
5

Im làm việc trên một công cụ dịch vụ nhỏ cho cơ sở dữ liệu. Vấn đề của tôi là do cập nhật cuối cùng, một số nhỏ colums phải được thay đổi thành số nguyên.Mã khung thực thể đầu tiên - Truyền nhỏ và số nguyên thành int32

public class TEST 
{ 
    public int ID { get; set; } 
    //public Int16 ID { get; set; } 
    public string TEST { get; set; } 

} 

Tôi đã đổi loại từ Int16 thành int. Mọi thứ hoạt động tốt, ngoại trừ việc tôi không thể sử dụng nó với phiên bản cũ của cơ sở dữ liệu nữa. Ngoại lệ là một cái gì đó giống như "System.Int32 dự kiến, tìm thấy Typ System.Int16".

Có cách nào để truyền tất cả smallint và integer thành int32 không?

Bất kỳ ý tưởng nào? Môi trường của tôi: EntityFramework 5.0.0 .NET 4.5 FirebirdClient 3.0.2.0

tôi đã cố gắng để buộc một dàn diễn viên trong modelbuilder:

 modelBuilder.Entity<TEST>() 
     .Property(p => p.ID) 
     .HasColumnType("smallint"); 

Ngoại lệ:

lỗi 2019: Thành viên Mapping được chỉ định không hợp lệ. Loại 'Edm.Int32 [Nullable = False, DefaultValue =]' của thành viên 'ID' trong Typ 'ContextRepository.TEST' không tương thích với 'FirebirdClient.smallint [Nullable = False, DefaultValue =, StoreGeneratedPattern = Identity]' của thành viên 'SCHLUESSEL' trong loại các Int16 ID 'CodeFirstDatabaseSchema.BUNDLAND'

Make và sau đó đúc tất cả mọi thứ để smallint (HasColumnType ("int")) hoạt động tốt nhưng sẽ cho tôi trường hợp ngoại lệ với những con số lớn hơn 31767 (max smallint) ...

+0

Tại sao bạn không thể nâng cấp cơ sở dữ liệu để sử dụng INTEGER cho cột này? –

+0

Tôi chỉ viết một chương trình bảo trì và có những lo ngại về tác dụng phụ trong ứng dụng chính ... – Dust258

Trả lời

7

Tôi đã tìm được giải pháp cho vấn đề của mình! Tôi phải sử dụng Int16 trong Model của tôi và sử dụng modelbuilder để thiết lập các cột kiểu để SMALLINT:

public class TEST 
{ 
    public Int16 ID { get; set; } 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<TEST>().HasKey(a => new { a.ID}); 
    modelBuilder.Entity<TEST>() 
    .Property(p => p.ID) 
    .HasColumnType("SMALLINT"); 
    base.OnModelCreating(modelBuilder); 
} 

Bây giờ tôi có thể đúc các tài sản để int mà không có ngoại lệ (thậm chí với số lượng> 32767):

var lQry = (from b in ctData.TEST 
    select new 
    { 
     ID = (int)b.ID, 
    }); 
+0

Tôi không hiểu cách biên dịch này? Bạn có hai thuộc tính có cùng tên. – michaelmsm89

+1

up, đã sửa nó ngay bây giờ – Dust258

+0

Bạn có cần HasColumnType ("SMALLINT") không? Tuyên bố int16 chưa đủ? –