EF4 Code First: как добавить связь без добавления свойства навигации - PullRequest
15 голосов
/ 07 марта 2011

Как определить отношения с помощью Code First, но без использования каких-либо свойств навигации?

Ранее я определил One-Many и Many-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; }
}

обратите внимание, что вместо свойства навигации у меня есть первичный ключ связанной таблицы.Все создается на столе - кроме отношений.Итак, как мне это сделать?

Кстати, я пробовал различные комбинации в методе OnModelCreating dbcontext, но безрезультатно.Любая помощь очень ценится!

Спасибо, Мел

Ответы [ 3 ]

24 голосов
/ 07 марта 2011

Я считаю, что вам всегда нужно свойство навигации по крайней мере с одной стороны при использовании кода в первую очередь. Тогда вы сможете отобразить это:

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 голос
/ 27 марта 2013

Вы можете использовать Свободный API для добавления отношения, хотя код «конфигурации» отделен от кода объекта, что делает его менее доступным для обнаружения.

0 голосов
/ 04 мая 2012

В EF 4.3 вы можете добавить миграцию, которая добавляет отношения.

...