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 咒语,但没有任何成功。很明显,问题在于它不知道如何将“LocationID”FK 正确导航到带有 ID 字段的 Location 类。但我一直无法弄清楚。

不知何故,我认为由于它是“Location”类型,并且 Location 类也独立映射到数据库,并且因为数据库中存在适当的 FK 关系,所以它会“弄清楚”。

任何帮助将不胜感激。

4

1 回答 1

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"));
}
于 2011-03-19T15:49:22.183 回答