2012-08-14 81 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

工作