Bỏ qua một thuộc tính lớp trong Mã thực thể 4.1 Mã đầu tiên


299

Tôi hiểu rằng [NotMapped]thuộc tính này không có sẵn cho đến khi EF 5 hiện đang có trong CTP nên chúng tôi không thể sử dụng nó trong sản xuất.

Làm cách nào để đánh dấu các thuộc tính trong EF 4.1 bị bỏ qua?

CẬP NHẬT: Tôi nhận thấy một cái gì đó khác lạ. Tôi đã có [NotMapped]thuộc tính để làm việc nhưng vì một số lý do, EF 4.1 vẫn tạo một cột có tên là Disposed trong cơ sở dữ liệu mặc dù public bool Disposed { get; private set; }nó được đánh dấu bằng [NotMapped]. Lớp học thực hiện IDisposeabletất nhiên nhưng tôi không thấy điều đó quan trọng như thế nào. Có suy nghĩ gì không?



Dường như với tôi rằng nó cũng nên áp dụng cho Entity Framework 4.1. Kiểm tra liên kết này: social.msdn.microsoft.com/Forums/eu/adodotnetentityframework/ mẹo
ilmatte

1
@SamLeach: Tôi đã đọc câu hỏi đó trước khi đăng bài của mình và không tìm thấy giải pháp. Câu hỏi là làm thế nào để đạt được điều tương tự trong EF4? Tôi đã bỏ lỡ một cái gì đó trong bài viết đó?
Raheel Khan

Đó là những gì tôi nghĩ cũng vì tôi có EF 4.1 và có thể thấy thuộc tính. Nhưng EF có vẻ khá vui khi hoàn toàn bỏ qua nó trong các ứng dụng của tôi. Điều này đúng với các kiểu tham chiếu gốc và tham chiếu cũng như các kiểu tham chiếu com như các ứng dụng xâm nhập văn phòng MS.
Raheel Khan

Tôi xin lỗi nhưng tôi đã làm một bài kiểm tra ngay bây giờ với một ứng dụng đơn giản và nó hoạt động. Bạn có thể cung cấp mã mẫu?
ilmatte

Câu trả lời:


594

Bạn có thể sử dụng NotMappedchú thích dữ liệu thuộc tính để hướng dẫn Code-First để loại trừ một thuộc tính cụ thể

public class Customer
{
    public int CustomerID { set; get; }
    public string FirstName { set; get; } 
    public string LastName{ set; get; } 
    [NotMapped]
    public int Age { set; get; }
}

[NotMapped]thuộc tính được bao gồm trong System.ComponentModel.DataAnnotationskhông gian tên.

Bạn có thể thay thế làm điều này với chức năng ghi Fluent APIđè OnModelCreatingtrong DBContextlớp của bạn :

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<Customer>().Ignore(t => t.LastName);
   base.OnModelCreating(modelBuilder);
}

http://msdn.microsoft.com/en-us/l Library / hh295847 (v = vs.103) .aspx

Phiên bản tôi đã kiểm tra là EF 4.3phiên bản ổn định mới nhất có sẵn khi bạn sử dụng NuGet.


Chỉnh sửa : SEP 2017

Lõi Asp.NET (2.0)

Chú thích dữ liệu

Nếu bạn đang sử dụng lõi asp.net ( 2.0 tại thời điểm viết bài này ), [NotMapped]thuộc tính có thể được sử dụng ở cấp độ thuộc tính.

public class Customer
{
    public int Id { set; get; }
    public string FirstName { set; get; } 
    public string LastName { set; get; } 
    [NotMapped]
    public int FullName { set; get; }
}

API thông thạo

public class SchoolContext : DbContext
{
    public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
    {
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Customer>().Ignore(t => t.FullName);
        base.OnModelCreating(modelBuilder);
    }
    public DbSet<Customer> Customers { get; set; }
}

3
Cảm ơn. Thật tốt khi thấy câu trả lời với nỗ lực đằng sau chúng. Tôi thực sự không nhận thấy dòng cuối cùng của bạn trước khi đánh dấu câu trả lời khác là chính xác. Vì câu trả lời của bạn đã có trước đây, tôi nghĩ thật công bằng khi thay đổi câu trả lời của bạn để sửa. Tôi chắc chắn @ilmatte sẽ không phiền.
Raheel Khan

13
Với v5> của EF hiện có trong System.ComponentModel.DataAnnotations.Schema
Daveo

Khi tôi sử dụng FluentMApping, trường vẫn được trả về trong tập kết quả, mặc dù NULL biết. Làm thế nào để tôi có được nó thậm chí không được trả lại?
Rodney

8
Việc sử dụng [NotMapped] cũng sẽ báo cho các trình tuần tự hóa khác (ví dụ JSON / XML) không ánh xạ thuộc tính này. Nếu bạn muốn chỉ ngăn ánh xạ vào bảng cơ sở dữ liệu, nhưng vẫn có các bộ nối tiếp truy cập vào thuộc tính, bạn phải sử dụng phương pháp OnModelCreating.
maxmantz

Mặc dù tôi chưa tìm ra chính xác làm thế nào, Điều này không hoạt động với các thuộc tính được kế thừa trên khung thực thể 6+ thuộc tính và api trôi chảy dường như bỏ qua hướng dẫn
PBo

35

Kể từ EF 5.0, bạn cần bao gồm System.ComponentModel.DataAnnotations.Schemakhông gian tên.


2
đây vẫn là trường hợp? Tôi đang sử dụng EF 6.0 và điều này không còn xảy ra nữa đối với dự án của tôi. Trừ khi tôi đã tham chiếu một không gian tên đã ở đâu đó tham chiếu ở trên.
JARRRG
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.