Как создать отношение один ко многим с помощью ADO.NET Entity Framework Code First? - PullRequest
2 голосов
/ 13 января 2012

Я борюсь с проблемой и из того, что я видел, ни одно из предложенных решений не работает.

В основном у меня есть два класса:

public class Role
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

public class ActionType
{
    public int ID { get; set;}
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual ICollection<Role> AllowedRoles { get; set; }

    public ActionType()
    {
        this.AllowedRoles = new List<Role>();
    }  
}

Я бы хотел, чтобы EF принудительно установил таблицу связей в БД, где FK используется для ссылки на отношение один ко многим.Каким-то образом код сначала создает таблицу для моего Role, где добавляется столбец ActionType_ID.Конечно, бесполезно, если к одному ActionType добавлено больше Role.A DBUpdateExcpetion отбрасывается.

Есть мысли о том, как мне решить эту проблему?Дело в том, что классовая роль не относится к ActionType, поскольку это бесполезно.

Спасибо!

1 Ответ

1 голос
/ 13 января 2012

Что вы действительно пытаетесь сделать? В настоящее время вы можете добавить больше Role с к одному ActionType, но одиночный Role нельзя добавить к нескольким ActionType с. Вы тоже этого хотите?

В таком случае вы не общаетесь один-ко-многим, но многие-ко-многим. Только отношение «многие ко многим» использует таблицу соединений (связей). Отношение «один ко многим» действительно означает, что зависимый объект (один на многих сторонах) имеет FK для основного объекта. Простейшим подходом является определение свойства навигации в Role:

public class Role
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual ICollection<ActionType> ActionTypes { get; set; } 
}

public class ActionType
{
    public int ID { get; set;}
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual ICollection<Role> AllowedRoles { get; set; } 
}

Если вы не хотите иметь свойство навигации в роли, вы должны использовать свободный API для описания отношения.

public class Context : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<ActionType>()
                    .HasMany(a => a.AllowedRoles)
                    .WithMany();
    }
}
...