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 操作时出现错误

DataBinding:“System.Data.Entity.DynamicProxies.Activity_AD12BF558F098271F1F51B3B1489B4B3B281FD0B686C8457333DE5BEE0E8B6A9”不包含名为“ActivityId”的属性

它试图在 Activity 表中找到 ActivityId,但主键是 Id。如何将 TimeEntry 表中的外键 ActivityId 映射到 Activity 表中的主键 Id。

4

3 回答 3

3

您可以使用 fluent 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>();
    }
}
于 2012-08-14T15:25:32.163 回答
1

嗨我有同样的问题

  1. 如果将 DataKeyNames 属性指定为 ID,则实际列名是 CustomerID。它会抛出上述错误。

  2. 如果将 DataTextField 或 DataValueField 属性指定为 ID,则实际列名称为 CustomerID。它会抛出上述错误。

并在这里找到了答案,它对我 有用链接

于 2014-07-05T15:27:16.257 回答
0

如果您使用 Code First,则需要通过在 DbContext 中覆盖 OnModelCreating来指示 ActivityId => Id 的映射。

根据建议,您似乎将 DTO 和 MVC ViewModel 的关注点混合在同一个实体中。为什么不将这些关注点分成 2 个不同的实体呢?

于 2012-08-14T15:28:51.037 回答