实体框架代码第一个FK关联问题

时间:2011-03-19 15:31:12

标签: entity-framework ef-code-first entity-framework-4.1

我正在尝试让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>

非常感谢任何帮助。

1 个答案:

答案 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"));
}