我一直在努力让EF4 CTP5在现有数据库中运行良好,但却遇到了一些基本的映射问题。
到目前为止我有两个模型类:
public class Job
{
[Key, Column(Order = 0)]
public int JobNumber { get; set; }
[Key, Column(Order = 1)]
public int VersionNumber { get; set; }
public virtual User OwnedBy { get; set; }
}
和
[Table("Usernames")]
public class User
{
[Key]
public string Username { get; set; }
public string EmailAddress { get; set; }
public bool IsAdministrator { get; set; }
}
我将DbContext类暴露为IDbSet
我可以查询我的用户,但是一旦我将OwnedBy字段添加到Job类,我就开始在我的所有测试中获得此错误:
无效的列名称'UserUsername'。
我希望它的行为类似于NHibernate的多对一,而我认为EF4将其视为复杂类型。该怎么做?
答案 0 :(得分:4)
UserUsername
是EF Code First为Jobs表中的外键选择的默认名称。显然,它与现有数据库对于Jobs表中的FK列的名称不同。您需要覆盖此约定并更改FK的默认名称,以使其与您的数据库匹配。以下是使用流畅API的方法:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Job>()
.HasOptional(j => j.OwnedBy)
.WithMany()
.IsIndependent()
.Map(m => m.MapKey(u => u.Username, "TheFKNameInYourDB"));
}
答案 1 :(得分:0)
尝试让它从您的架构中创建新数据库,并查看它所期望的列名。
我认为它是OwnedBy的关键。它尝试根据其内部约定命名它,这与您为foreing键列命名的方式不兼容。不,它真的将它视为多对一。