ละเว้นคลาสของคุณสมบัติใน Entity Framework 4.1 Code First


299

ความเข้าใจของฉันคือว่า[NotMapped]แอ็ตทริบิวต์ไม่สามารถใช้ได้จนกว่าจะถึง EF 5 ซึ่งปัจจุบันเป็น CTP ดังนั้นเราจึงไม่สามารถใช้มันในการผลิตได้

ฉันจะทำเครื่องหมายคุณสมบัติใน EF 4.1 ที่จะเพิกเฉยได้อย่างไร

UPDATE:ฉันสังเกตเห็นสิ่งแปลก ๆ ผมได้[NotMapped]แอตทริบิวต์การทำงาน แต่ด้วยเหตุผลบางอย่าง EF 4.1 ยังคงสร้างคอลัมน์ชื่อทิ้งในฐานข้อมูลแม้ว่าจะมีเครื่องหมายpublic bool Disposed { get; private set; } [NotMapped]ชั้นเรียนดำเนินการอย่างIDisposeableแน่นอน แต่ฉันไม่เห็นว่ามันจะมีความสำคัญอย่างไร ความคิดใด ๆ



ฉันคิดว่ามันควรใช้กับ Entity Framework 4.1 เช่นกัน ตรวจสอบลิงค์นี้: social.msdn.microsoft.com/Forums/eu/adodotnetentityframework/…
ilmatte

1
@ SamLeach: ฉันได้อ่านคำถามนั้นแล้วก่อนโพสต์ของตัวเองและไม่พบวิธีแก้ปัญหา คำถามคือทำอย่างไรจึงจะได้ผลสำเร็จเหมือนกันใน EF4 ฉันพลาดบางสิ่งในโพสต์นั้นหรือไม่
Raheel Khan

นั่นคือสิ่งที่ฉันคิดเช่นกันเนื่องจากฉันมี EF 4.1 และสามารถดูคุณลักษณะได้ แต่ EF ดูเหมือนว่าจะมีความสุขที่จะไม่สนใจมันในใบสมัครของฉัน นี่เป็นความจริงของประเภทเนทีฟและประเภทอ้างอิงรวมถึงประเภทอ้างอิง com เช่นแอปพลิเคชัน intrerop ของ MS office
Raheel Khan

ฉันขอโทษ แต่ตอนนี้ฉันได้ทำการทดสอบด้วยแอพพลิเคชั่นที่ใช้งานง่ายและใช้งานได้ คุณสามารถให้รหัสตัวอย่างได้ไหม
ilmatte

คำตอบ:


594

คุณสามารถใช้NotMappedบันทึกย่อข้อมูลคุณลักษณะเพื่อสั่งให้ Code-First เพื่อแยกคุณสมบัติเฉพาะ

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]แอตทริบิวต์รวมอยู่ในSystem.ComponentModel.DataAnnotationsnamespace

คุณสามารถทำสิ่งนี้ได้ด้วยฟังก์ชั่นการFluent APIเอาชนะOnModelCreatingในDBContextชั้นเรียนของคุณ:

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

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

เวอร์ชันที่ฉันตรวจสอบคือ EF 4.3เวอร์ชันเสถียรล่าสุดที่มีให้เมื่อคุณใช้ NuGet


แก้ไข : กันยายน 2017

Asp.NET Core (2.0)

คำอธิบายประกอบข้อมูล

หากคุณใช้แกน asp.net ( 2.0 ณ เวลาที่เขียนนี้ ) แอ [NotMapped]ททริบิวสามารถใช้กับระดับคุณสมบัติได้

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 ที่คล่องแคล่ว

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
ขอบคุณ มันเป็นการดีเสมอที่จะเห็นคำตอบด้วยความพยายามที่อยู่เบื้องหลังพวกเขา ฉันไม่ได้สังเกตบรรทัดสุดท้ายของคุณก่อนทำเครื่องหมายคำตอบอื่นว่าถูกต้อง เนื่องจากคำตอบของคุณเข้ามาก่อนฉันคิดว่ามันยุติธรรมที่จะเปลี่ยนคำพูดของคุณให้ถูกต้อง ฉันแน่ใจว่า @ilmatte จะไม่รังเกียจ
Raheel Khan

13
ด้วย v5> ของ EF ตอนนี้อยู่ใน System.ComponentModel.DataAnnotations.Schema
Daveo

เมื่อฉันใช้ FluentMApping ฟิลด์จะยังคงกลับมาใน resultset แม้ว่ามันจะเป็นโมฆะรู้ ฉันจะทำให้ไม่สามารถส่งคืนได้อย่างไร
ร็อดนีย์

8
การใช้ [NotMapped] จะบอกให้ทราบว่า serializers อื่น ๆ (เช่น JSON / XML) เพื่อไม่จับคู่คุณสมบัตินี้ ถ้าคุณต้องการป้องกันการแมปไปยังตารางฐานข้อมูลเท่านั้น แต่ยังคงมีซีเรียลไลเซอร์เข้าถึงคุณสมบัติคุณต้องใช้วิธีการ OnModelCreating
maxmantz

แม้ว่าฉันจะไม่ทราบวิธีการนี้ไม่ทำงานกับคุณสมบัติสืบทอดมาในกรอบงานเอนทิตี้ของ 6+ คุณลักษณะและ API ได้อย่างคล่องแคล่วดูเหมือนจะไม่สนใจคำแนะนำ
PBo

35

ในฐานะของ EF 5.0 คุณต้องรวมSystem.ComponentModel.DataAnnotations.Schemaเนมสเปซ


2
เป็นกรณีนี้หรือไม่? ฉันใช้ EF 6.0 และนี่ไม่ใช่กรณีอย่างน้อยไม่ใช่สำหรับโครงการของฉัน ถ้าฉันไม่ได้อ้างถึงเนมสเปซที่มีอยู่แล้วบางที่อ้างอิงข้างต้น
JARRRRG
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.