2012-08-14 80 views
1

我有兩個使用codefirst實體框架構建的表。實體框架和數據綁定

public class TimeEntry:Entity 
{ 
    [Required] 
    [Display(Name = "Activity")] 
    public int ActivityId { get; set; } 

    public virtual Activity Activity { get; set; } 
} 

public class Activity:Entity 
{ 
    private ICollection<TimeEntry> _timeEntries; 


    [Required] 
    public string Description { get; set; } 

    public virtual ICollection<TimeEntry> TimeEntries 
    { 
     get 
     { 
      return _timeEntries ?? (_timeEntries = new List<TimeEntry>()); 
     } 
     set 
     { 
      _timeEntries = value; 
     } 
    } 
} 
public class Entity 
{ 
    public int Id { get; set; } 
} 

這些是我爲我的Db創建的類。創建數據庫沒有問題。當我嘗試執行CRUD操作我的錯誤

數據綁定:「System.Data.Entity.DynamicProxies.Activity_AD12BF558F098271F1F51B3B1489B4B3B281FD0B686C8457333DE5BEE0E8B6A9」不包含名爲「ActivityId」

它試圖屬性在Activity表中查找ActivityId,但主鍵是Id。如何將TimeEntry表中的外鍵ActivityId映射到Activity表中的主鍵Id。

回答

3

你可以使用流利的api讓EF瞭解你的映射。

public class ActivityMap : EntityTypeConfiguration<Activity> 
{ 
    public ActivityMap() 
    { 
     this.HasKey(a => a.Id); 
    } 
} 

public class TimeEntryMap : EntityTypeConfiguration<TimeEntry> 
{ 
    public TimeEntryMap() 
    { 
     this.HasKey(t => t.Id); 
     // Relationships 
     this.HasRequired(t => t.Activity) 
      .WithMany(t => t.TimeEntries) 
    }   .HasForeignKey(d => d.ActivityId); 
} 

然後在上下文:

public class MyDbContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new ActivityMap()); 
     modelBuilder.Configurations.Add(new TimeEntryMap()); 
    } 
} 

我認爲這將解決您的問題。

此外,(作爲一個附註),而不是定義_timeEntries,你可以使用自動實現的屬性爲TimeEntries並初始化它在你ctor。如下圖所示:

public class Activity:Entity 
{ 
    public virtual ICollection<TimeEntry> TimeEntries { get; set; } 
    public Activity() 
    { 
     this.TimeEntries = new List<TimeEntry>(); 
    } 
} 
0

如果使用代碼首先,你需要overriding OnModelCreating in your DbContext指示ActivityId => Id的映射。

在一個建議,似乎你是在同一個實體混合DTO和MVC ViewModel的關注。爲什麼不把這些問題分成兩個不同的實體?

2

您好我有同樣的問題

  1. 如果一個指定DataKeyNames屬性作爲ID和實際的列名是客戶ID。它會拋出上述錯誤。

  2. 如果指定DataTextField或DataValueField屬性爲ID,並且實際列名稱爲CustomerID。它會拋出上述錯誤。

,在這裏找到了答案對我來說link

工作