EF4 Code-First CTP5多对一

时间:2011-01-01 18:34:06

标签: c# entity-framework-4 code-first

我一直在努力让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将其视为复杂类型。该怎么做?

2 个答案:

答案 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键列命名的方式不兼容。不,它真的将它视为多对一。