2015-05-22 15 views
7

Tôi đã cố gắng tìm ra cách thiết lập độ chính xác thập phân cho EF7 (Beta 4) mà không có may mắn.Entity Framework 7 Đặt độ chính xác thập phân cho trình tạo mô hình

Tôi đã chờ đợi để làm một cái gì đó như:

modelBuilder.Entity<SomeClass>().Property(p => p.DecimalProperty).Precision(10, 6) 

này không xuất hiện để có sẵn, nhưng tôi đã có thể tìm thấy những lớp sau trong kho trong GitHub:

https://github.com/aspnet/EntityFramework/blob/7.0.0-beta4/src/EntityFramework.Relational/RelationalDecimalTypeMapping.cs

Không có ví dụ về việc sử dụng các lớp RelationalTypeMapping hoặc các chữ ký phương thức với chúng. Có lẽ điều này chỉ được sử dụng như một phần của bản đồ api để lấy thông tin?

Một nơi tôi có thể mong đợi điều này là như sau:

modelBuilder.Entity<SomeClass>().Property(p => p.DecimalProperty).ForRelational().ColumnType() 

hoặc

modelBuilder.Entity<SomeClass>().Property(p => p.DecimalProperty).ForSqlServer().ColumnType() 

Những chỉ mất một chuỗi, là chức năng này chỉ chưa được thực hiện hoặc tôi chỉ không nhìn ở đúng chỗ?

Chỉnh sửa: Chỉ cần nhận ra rằng chuỗi có thể là kiểu .ColumnType ("thập phân (10,6)") cho đến khi điều này được xây dựng thêm nữa, vẫn không nhớ làm rõ không sử dụng dây cho

chỉnh sửa này: sau khi làm rõ từ bricelam tôi đã kết thúc việc tạo ra phần mở rộng sau đây để sử dụng cho bây giờ để tránh sử dụng các chuỗi, và tôi đánh giá cao sự đơn giản của cách tiếp cận của họ:

public static RelationalPropertyBuilder DecimalPrecision(this RelationalPropertyBuilder propertyBuilder, int precision, int scale) 
    { 
     return propertyBuilder.ColumnType($"decimal({precision},{scale})"); 
    } 

Ví dụ sử dụng:

modelBuilder.Entity<SomeClass>().Property(p => p.DecimalProperty).ForRelational().DecimalPrecision(10,6); 

Edit: Làm sửa đổi cho RC1

tôi đã không kiểm tra những nêu ra, nhưng tôi chỉ ném lại với nhau sau 2 mẫu của những gì điều này có lẽ sẽ giống như với RC1

public static PropertyBuilder DecimalPrecision(this PropertyBuilder propertyBuilder, string precision, string scale) 
    { 
     return propertyBuilder.HasColumnType($"decimal({precision},{scale})"); 
    } 

    public static PropertyBuilder SqlDecimalPrecision(this PropertyBuilder propertyBuilder, string precision, string scale) 
    { 
     return propertyBuilder.ForSqlServerHasColumnType($"decimal({precision},{scale})"); 
    } 

Vì tôi chưa thử điều này tôi không chắc chắn đó sẽ là cách sử dụng chính xác giữa "HasColumnType" hoặc "ForSqlServerHasColumnType", nhưng hy vọng điều này sẽ chỉ một người nào đó đi đúng hướng.

+0

Vì tất cả các thuộc tính thập phân của tôi có cùng độ chính xác, bất kỳ cách nào để thực hiện điều này trên tất cả trong một dòng? Tôi đã sử dụng nó với EF6: 'modelBuilder.Properties () .Cấu hình (x => x.HasPrecision (18, 6)); ' – GregoryHouseMD

+0

@reala valoro, tôi đã cập nhật chi tiết để phản ánh các thay đổi RC1 –

Trả lời

4

Giải pháp thay thế của bạn là thiết kế mà chúng tôi dự định. Thay vì có một loạt các "khía cạnh", bạn có thể đặt trên một loại như độ chính xác, tỷ lệ, độ dài tối đa, unicode/ansi, độ dài cố định/biến, v.v. Chúng tôi quyết định giữ nó đơn giản: bạn muốn, cho chúng tôi biết loại sử dụng. Đã có những cuộc đàm phán về việc quay trở lại quyết định này và giới thiệu lại "các khía cạnh". Nếu bạn cảm thấy mạnh mẽ về điều đó, tôi sẽ khuyến khích bạn create a new issue.

Cũng lưu ý rằng có một loạt các lỗi khác trong ánh xạ kiểu ngay bây giờ, nhưng chúng phải được khắc phục khi chúng tôi phát hành beta5.

+0

Cảm ơn bạn đã làm rõ, tôi đã chỉnh sửa câu hỏi bằng một phần mở rộng đơn giản mà tôi đã tạo để tránh chuỗi. Tôi sẽ không ngạc nhiên khi thấy những giới thiệu lại trên đường, nhưng tôi sẽ không nghĩ rằng điều này đảm bảo một vấn đề được tạo ra khi các bạn có cá lớn hơn nhiều để chiên :) Tôi đánh giá cao tất cả công việc các bạn đang làm và tôi thực sự mong muốn được sử dụng EF7 nhiều hơn nữa! –

1

Ví dụ được hiển thị có vẻ đã lỗi thời theo EF RC1.

Dưới đây là cách tôi đặt độ chính xác trên trường thập phân.

Nói rằng tôi có một thực thể

public class Review 
{ 
    public int ReviewId { get; set; } 
    public decimal TotalScore { get; set; } //I want a precision field in DB 
    public DateTime CreatedOn { get; set; } 
    [Timestamp] 
    public byte[] RowVersion { get; set; } 
} 

sau đó trong lớp bối cảnh của tôi, trên mô hình tạo, tôi nhanh chóng các bản đồ (tôi có thể làm các bản đồ ở đó, nhưng tôi muốn giữ nó tách ra)

public class MyDbContext : DbContext 
{ 
    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) 
    { 
    } 

    public DbSet<Review> Reviews { get; set; } 
    //etc. 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     //Mappings 
     new ReviewMap(modelBuilder.Entity<Review>()); 
     //etc.. 
    } 
} 

và sau đó là ánh xạ. Hãy nhớ sử dụng không gian tên nơi các tiện ích mở rộng Mô hình là:

using Microsoft.Data.Entity; //here is where the extensions are 
public class ReviewMap 
{ 
    public ReviewMap(EntityTypeBuilder<Review> entityBuilder) 
    { 
     entityBuilder.HasKey(r => r.ReviewId); 

     //Using the column type extension 
     entityBuilder.Property(r => r.TotalScore) 
      .HasColumnType($"decimal(5,2)") 
      .IsRequired(true); 

     //and this has nothing to do with the example but it's interesting 
     //to show how to use Sql command to automatically fulfil a value 
     //when adding a new Entity 
     entityBuilder.Property(r => r.CreatedOn) 
      .ValueGeneratedOnAdd() 
      .HasDefaultValueSql("GETUTCDATE()") 
      .IsRequired(true); 
    } 
} 
Các vấn đề liên quan