EF4 Code First:如何在不添加导航属性的情况下添加关系

时间:2011-03-07 08:30:20

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

如何使用Code First定义关系但不使用任何导航属性?

以前我通过在关系的两端使用导航属性来定义One-Many和Many-Many。并在数据库中创建适当的关系。这里是类的外观的简化版本(为了简单起见,我将Many-Many关系转换为one-many)。

public class User 
{
    public string UserId { get; set; }
    public string PasswordHash { get; set; }
    public bool IsDisabled { get; set; }
    public DateTime AccessExpiryDate { get; set; }
    public bool MustChangePassword { get; set; }

    public virtual Role Role { get; set; }
}

public class Role
{
    public int RoleId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

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

public class Right
{
    public Guid RightId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual Role Role { get; set; }
}

但是,如果删除导航属性,则不会创建任何关系。以下是类的外观。

public class User 
{
    public string UserId { get; set; }
    public string PasswordHash { get; set; }
    public bool IsDisabled { get; set; }
    public DateTime AccessExpiryDate { get; set; }
    public bool MustChangePassword { get; set; }

    public int Role RoleId { get; set; }
}

public class Role
{
    public int RoleId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

public class Right
{
    public Guid RightId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public int RoleId { get; set; }
}

请注意,我没有导航属性,而是拥有相关表的主键。一切都在桌子上创造 - 除了关系。那么我该怎么做呢?

顺便说一句,我在dbcontext的OnModelCreating方法中尝试了各种组合,但无济于事。非常感谢任何帮助!

谢谢, 梅尔

3 个答案:

答案 0 :(得分:24)

我相信在使用代码优先时,您至少需要在一侧使用导航属性。然后你就可以映射它了:

public class User  
{     
    public string UserId { get; set; }     
    public string PasswordHash { get; set; }     
    public bool IsDisabled { get; set; }     
    public DateTime AccessExpiryDate { get; set; }     
    public bool MustChangePassword { get; set; }      
    public int RoleId { get; set; }
    public Role Role { get; set; }
}  

public class Role 
{     
    public int RoleId { get; set; }     
    public string Name { get; set; }     
    public string Description { get; set; } 
}  

public class Right 
{     
    public Guid RightId { get; set; }     
    public string Name { get; set; }     
    public string Description { get; set; }      
    public int RoleId { get; set; }
    public Role Role { get; set; }
} 

public class TestContext : DbContext
{
    public TestContext() : base("Entities")
    {}

    protected override void  OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<User>()
            .HasRequired(r => r.Role)
            .WithMany()
            .HasForeignKey(r => r.RoleId);

        modelBuilder.Entity<Right>()
            .HasRequired(r => r.Role)
            .WithMany()
            .HasForeignKey(r => r.RoleId);
    }
}

答案 1 :(得分:1)

您可以使用fluent api添加关系,但“配置”代码与实体代码分开,使其不易被发现。

答案 2 :(得分:-1)

在EF 4.3中,您可以添加添加关系的迁移。