我正在尝试让CodeFirst工作,并且遇到外键和相关对象的问题。这可能是由于我没有匹配“约定”,还没有理解如何正确覆盖我的设置中的约定。如果可以,请帮忙。
我在现有数据库中有这两个表:
create table locations
(
ID int identity primary key
, name varchar(50) not null
)
create table meetings
(
ID int identity primary key
, whatever varchar(50) null
, LocationID int not null constraint FK_meetings_LocationID foreign key references locations(ID)
)
模型设置如下:
public class Location
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Meeting> Meetings { get; set; }
}
public class Meeting
{
public int ID { get; set; }
public string Whatever{ get; set; }
public Location HeldAt { get; set; }
}
最后,我的上下文设置如下:
public class v1Context : DbContext
{
public v1Context(string ConnectionString)
: base(ConnectionString)
{}
public DbSet<Location> Locations { get; set; }
public DbSet<Meeting> Meetings { get; set; }
//protected override void OnModelCreating(DbModelBuilder modelBuilder)
//{
// modelBuilder.Entity<Location>().HasKey(k => k.ID);
// modelBuilder.Entity<Meeting>().HasKey(k => k.ID);
//}
}
并且,我收到以下错误“执行命令定义时发生错误。有关详细信息,请参阅内部异常”..使用InnerExceptin:
InnerException = {"Invalid column name 'HeldAt_ID'."}
我尝试过OnModelCreating的各种咒语,没有任何成功。很明显,问题在于它不知道如何使用ID字段将“LocationID”FK正确导航到Location类。但是我一直无法理解它。
不知怎的,我认为因为它是“Location”类型,并且Location类也独立地映射到数据库,并且因为数据库中存在适当的FK关系,所以它只是“弄明白”。 / p>
非常感谢任何帮助。
答案 0 :(得分:3)
您不对列使用默认名称,因此您必须在OnModelBuilding
中指定它们:
使用此选项将LocationID定义为外键列,而不是默认的预期HeldAt_ID:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Meeting>()
.HasRequired(m => m.HeldAt)
.WithMany(l => l.Meetings)
.Map(m => m.MapKey("LocationID"));
}