實體框架列名稱到屬性映射dbentry


我正在嘗試將實體屬性映射到數據庫列名,同時在DbContext中保存實體,但我無法想像如何在EF7中執行此操作。

生成具有遷移的數據庫模式後,列名稱並不總是與object中的屬性名稱相同。例如,在對像模式下面:

public class Document
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }

    public User Author { get; set; }
}

將在數據庫中具有IdNameAuthorId列。接下來當我迭代EntityEntry屬性時,它包含Id,Name和AthorId列。我可以輕鬆地映射Id和Name。
我正在尋找的是如何弄清楚EntityEntry中的“AuthorId”是否映射到Document中的Author字段?



Backround :我正在實現通用對象版本歷史機制,它將從EntityEntries(來自DbContext中的SaveChanges ()中的ChangeTracker獲得修改的列)並保存適當的列及其新值。接下來,在恢復對象時,它應該能夠將這些更改映射到正確的實體字段。

我在EF6中發現了類似的問題Entity Framework在哪裡存儲屬性名稱與它在SQL中選擇的列之間的映射?但它非常複雜,並使用特定於EF6的類。

熱門答案

根據我的評論, Author字段不是簡單的對象/結構(IE: DateTimeEnum等),也不是原語(IE: intstring等)。因此,它是一個Navigation Property ,只存儲對象的ID。然後,此ID允許您導航到另一個表中存儲Author對象的複雜數據的行。

因此,你需要一個DbContextDbSet如下:

public class Document {
    public int Id { get; set; } // No need for [Key] ID is auto detected
    public string Name { get; set; }

    // Foreign Keys
    public int AuthorId { get; set; } // Can use "int?" if you want to allow it to be nullable
    public User Author { get; set; }
}

public class Author {
    public int Id { get; set; }
    public string Name { get; set; }
}

public class BookContext : DbContext {
    public DbSet<Author> Authors { get; set; }
    public DbSet<Document> Documents { get; set; }
}

這將產生表格:

public class Document {
    public int Id { get; set; } // No need for [Key] ID is auto detected
    public string Name { get; set; }

    // Foreign Keys
    public int AuthorId { get; set; } // Can use "int?" if you want to allow it to be nullable
    public User Author { get; set; }
}

public class Author {
    public int Id { get; set; }
    public string Name { get; set; }
}

public class BookContext : DbContext {
    public DbSet<Author> Authors { get; set; }
    public DbSet<Document> Documents { get; set; }
}

查詢數據庫時:

public class Document {
    public int Id { get; set; } // No need for [Key] ID is auto detected
    public string Name { get; set; }

    // Foreign Keys
    public int AuthorId { get; set; } // Can use "int?" if you want to allow it to be nullable
    public User Author { get; set; }
}

public class Author {
    public int Id { get; set; }
    public string Name { get; set; }
}

public class BookContext : DbContext {
    public DbSet<Author> Authors { get; set; }
    public DbSet<Document> Documents { get; set; }
}




許可下: CC-BY-SA
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因