อย่าแมปคุณสมบัติ ReactiveUI ใน Entity Framework

การใช้รหัส Entity Framework ก่อนอื่น ฉันได้สร้างออบเจ็กต์บางอย่างเพื่อจัดเก็บข้อมูลในฐานข้อมูลของฉัน ฉันใช้คลาส ReactiveObject จากไลบรารี ReactiveUI ในออบเจ็กต์เหล่านี้ ดังนั้นฉันจึงได้รับการแจ้งเตือนทุกครั้งที่มีการเปลี่ยนแปลงคุณสมบัติสำหรับ UI ที่ตอบสนองมากขึ้น

แต่การใช้สิ่งนี้จะเพิ่มคุณสมบัติ 3 อย่าง ได้แก่ Changed, Changing และ ThrowExceptions ให้กับอ็อบเจ็กต์ของฉัน ฉันไม่คิดว่านี่เป็นปัญหาจริงๆ แต่เมื่อโหลดตารางใน DataGrid สิ่งเหล่านี้ก็จะได้รับคอลัมน์เช่นกัน

มีวิธีซ่อนคุณสมบัติเหล่านี้หรือไม่? ฉันไม่สามารถกำหนดคอลัมน์ด้วยตนเองได้เพราะฉันมี 1 datagrid สำหรับตารางทั้งหมดของฉัน ซึ่งฉันเลือกจากคอมโบบ็อกซ์

พบวิธีแก้ปัญหาด้านล่างและที่นี่: มีวิธีซ่อนคอลัมน์เฉพาะใน DataGrid เมื่อ AutoGenerateColumns=True หรือไม่

    void dataTable_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        List<string> removeColumns = new List<string>()
        {
            "Changing",
            "Changed",
            "ThrownExceptions"
        };

        if (removeColumns.Contains(e.Column.Header.ToString()))
        {
            e.Cancel = true;
        }
    }

person Kryptoxx    schedule 15.07.2013    source แหล่งที่มา


คำตอบ (1)


มีหลายวิธีในการดำเนินการนี้ด้วย Code First ตัวเลือกแรกคือการใส่คำอธิบายประกอบคุณสมบัติด้วย NotMappedAttribute< /ก>:

[NotMapped]
public bool Changed { get; set; }

นี่เป็นข้อมูลของคุณ เนื่องจากคุณกำลังสืบทอดคลาสพื้นฐานและไม่สามารถเข้าถึงคุณสมบัติของคลาสนั้น คุณจึงไม่สามารถใช้สิ่งนี้ได้ ตัวเลือกที่สองคือการใช้ Fluent Configuration ด้วย Ignore วิธีการ:

modelBuilder.Entity<YourEntity>().Ignore(e => e.Changed);
modelBuilder.Entity<YourEntity>().Ignore(e => e.Changing);
modelBuilder.Entity<YourEntity>().Ignore(e => e.ThrowExceptions);

หากต้องการเข้าถึง DbModelBuilder ให้แทนที่ OnModelCreating วิธีการใน DbContext ของคุณ:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // .. Your model configuration here
}

อีกทางเลือกหนึ่งคือการสร้างคลาสที่สืบทอด EntityTypeConfiguration<T>:

public abstract class ReactiveObjectConfiguration<TEntity> : EntityTypeConfiguration<TEntity>
    where TEntity : ReactiveObject
{

    protected ReactiveObjectConfiguration()
    {
        Ignore(e => e.Changed);
        Ignore(e => e.Changing);
        Ignore(e => e.ThrowExceptions);
    }
}

public class YourEntityConfiguration : ReactiveObjectConfiguration<YourEntity>
{
    public YourEntityConfiguration()
    {
        // Your extra configurations
    }
}

ข้อดีของวิธีนี้คือ คุณกำหนดการกำหนดค่าพื้นฐานสำหรับ ReactiveObject ทั้งหมดของคุณ และกำจัดคำจำกัดความที่ซ้ำซ้อนทั้งหมด

ข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่า Fluent ในลิงก์ด้านบน

person Simon Belanger    schedule 15.07.2013