【问题标题】:Entity Framework and Data binding实体框架和数据绑定
【发布时间】:2012-08-14 15:14:39
【问题描述】:

我有两个使用 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。

【问题讨论】:

    标签: entity-framework foreign-key-relationship


    【解决方案1】:

    您可以使用 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 的自动实现属性并在您的ctor 中初始化它,而不是定义_timeEntries。如下:

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

    【讨论】:

      【解决方案2】:

      你好,我也有同样的问题

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

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

      并在这里找到答案,它对我有用link

      【讨论】:

        【解决方案3】:

        如果你使用Code First,则需要用overriding OnModelCreating in your DbContext指明ActivityId => Id的映射。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-21
          • 2014-12-05
          相关资源
          最近更新 更多