实体框架和数据绑定
问题描述:
我有两个使用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。
答
你可以使用流利的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>();
}
}
答
如果使用代码首先,你需要overriding OnModelCreating in your DbContext指示ActivityId => Id的映射。
在一个建议,似乎你是在同一个实体混合DTO和MVC ViewModel的关注。为什么不把这些问题分成两个不同的实体?
答
您好我有同样的问题
如果一个指定DataKeyNames属性作为ID和实际的列名是客户ID。它会抛出上述错误。
如果指定DataTextField或DataValueField属性为ID,并且实际列名称为CustomerID。它会抛出上述错误。
,在这里找到了答案对我来说link
工作