5

Tôi có một lớp được gọi là Khách hàng được ánh xạ tới một bảng cơ sở dữ liệu sử dụng mã khung Entity trước tiên. Bảng này có một trường được tính toán mà tôi cần có sẵn trong lớp Client của tôi, nhưng tôi hiểu rằng nó sẽ không thể ghi vào trường này. Có cách nào để cấu hình khung Entity để bỏ qua thuộc tính khi lưu, nhưng bao gồm thuộc tính khi đọc?Mã khung thực thể đầu tiên - Cách bỏ qua một cột khi lưu

Tôi đã thử sử dụng phương pháp Bỏ qua trong lớp cấu hình của tôi hoặc sử dụng thuộc tính [Không được ánh xạ], nhưng chúng ngăn không cho đọc thuộc tính từ cơ sở dữ liệu.

Trả lời

9

Bạn có thể sử dụng DatabaseGeneratedAttribute với DatabaseGeneratedOption.Computed tùy chọn:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public ComputedPropertyType ComputedProperty { get; set; } 

hoặc nếu bạn thích api thạo bạn có thể sử dụng HasDatabaseGeneratedOption phương pháp trong DbContext lớp học của bạn:

public class EntitiesContext : DbContext 
{ 
    public DbSet<EntityType> Enities { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<EntityType>().Property(e => e.ComputedProperty).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 
    } 
} 
+1

Cảm ơn, đó có vẻ là câu trả lời. Tuy nhiên, vì tôi đang sử dụng thuộc tính đã tính của mình làm tham chiếu khóa ngoài cho một bảng khác, bây giờ tôi nhận được "Thuộc tính phụ thuộc trong ReferentialConstraint được ánh xạ tới cột do cửa hàng tạo." Có phải nó sẽ không còn có thể sử dụng nó như là một tài liệu tham khảo chính nước ngoài? –

+0

@EasyTimer Tôi thành thật có thời gian khó khăn để tưởng tượng một kịch bản như vậy. Từ quan điểm EF, điều này là không thể vì EF cần có khả năng cập nhật khoá ngoại nếu bạn thay đổi tham chiếu trong ứng dụng. Có thể trong trường hợp của bạn (vì tôi không biết yêu cầu chính xác của bạn) chỉ có các thuộc tính điều hướng sẽ là đủ, hãy xem tại đây: http://stackoverflow.com/questions/5691780/navigation-property-without-declaring-foreign -key – tpeczek

+0

Tôi đã giải quyết được vấn đề của mình bằng cách chia lớp của tôi thành hai như trong bài viết này http://weblogs.asp.net/manavi/archive/2011/04/24/associations-in-ef-4-1-code- first-part-4-table-splitting.aspx Tôi có một lớp có chứa trường được tính toán và một lớp khác có chứa bất kỳ trường nào mà tôi cần để có thể chỉnh sửa. –

3

Đánh dấu tài sản như tính:

modelBuilder 
    .Entity<MyEntityType>() 
    .Property(_ => _.MyProperty) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 
+0

Cảm ơn, đó có vẻ là câu trả lời. Tuy nhiên, vì tôi đang sử dụng thuộc tính đã tính của mình làm tham chiếu khóa ngoài cho một bảng khác, bây giờ tôi nhận được "Thuộc tính phụ thuộc trong ReferentialConstraint được ánh xạ tới cột do cửa hàng tạo." Có phải nó sẽ không còn có thể sử dụng nó như là một tài liệu tham khảo chính nước ngoài? –

+0

@EasyTimer: thuộc tính được tính là khóa ngoại? CHÚA ƠI. Bạn sẽ làm gì, nếu kết quả tính toán sẽ không khớp với bất kỳ giá trị khóa chính nào trong bảng khóa chính? – Dennis

+0

Tôi nhận ra đây là một kịch bản không bình thường và không lý tưởng. Khi điều đó xảy ra, bảng khóa chính là chính chế độ xem có khóa chính được tính theo cùng một cách với bảng khóa ngoài và có thể không có bất kỳ sự khác biệt nào. Đó là tất cả các phần giới thiệu mã mới vào một hệ thống kế thừa, nơi tay tôi bị trói nhẹ. –