我是否正确配置CodeFirst一对多关系?

时间:2014-02-03 21:41:44

标签: c# database entity-framework ef-code-first entity-framework-6

当我尝试添加与另一个项目具有一对多关系的项目时,我遇到了错误。我不知道为什么会这样,但这是相关的代码:

public class ResourcesContext : DbContext
{
    public MyContext() : base("MyContext")
    {

    }

    public DbSet<UserSupervisor> UserSupervisor { get; set; }
    public DbSet<User> User { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<UserSupervisor>().HasKey(t => t.Id).HasMany(t => t.Users);
        modelBuilder.Entity<User>().HasKey(i => i.Id).HasRequired(i => i.Tutor);
        modelBuilder.Entity<User>().HasMany(u => u.Items);
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}

public class UserSupervisor
{
    private string _emailAddress;
    public int Id { get; set; }
    public string Name { get; set; }
    public string EmailAddress
    {
        get { return _emailAddress; }
        set { _emailAddress = value.Replace("@someemail.address", ""); }
    }

    public virtual ICollection<User> Users { get; set; }
}

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public int UserNumber { get; set; }

    public virtual UserSupervisor Tutor { get; set; }
}

这是我的app.config连接字符串:

<add name="MyContext" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=MyApp;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>

我完全难过了。但是,我不知道为什么会这样。有谁知道为什么?

1 个答案:

答案 0 :(得分:1)

除非是拼写错误,否则您尝试访问

中用户类上的非现有属性项
modelBuilder.Entity<User>().HasMany(u => u.Items);

此外,由于您使用的是代码优先(假设您没有摆弄约定设置),您不必指定键和关系,而是让Convention处理它。通过在您的实体上具有属性int Id,它将自动成为该表的主键。

通过在属于同一DbContext的实体类上具有导航属性,您不必指定关系。因此,Tutor上的用户集合和用户上的Tutor将自动创建关系。您唯一需要指定的是需要Tutor。