.NET MVC Entity Framework: один ко многим и много ко многим между одними и теми же двумя таблицами? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть приложение .NET MVC, в котором я создал отношение «многие ко многим» между пользователями и компаниями (это те компании, к которым пользователь имеет доступ).

в пользовательской модели я добавил коллекцию компаний:

public virtual ICollection<Company> companies { get; set; }

, а в модели компании я добавил коллекцию пользователей:

public virtual ICollection<ApplicationUser> users { get; set; }

и добавил это в OnModelCreating():

    modelBuilder.Entity<ApplicationUser>()
        .HasMany<Company>(s => s.companies)
        .WithMany(c => c.users)
        .Map(cs =>
        {
            cs.MapLeftKey("id_user");
            cs.MapRightKey("id_company");
            cs.ToTable("users_companies");
        });

Работает нормально.Но теперь мне нужно добавить FK для пользователей, чтобы добавить необязательную компанию для пользователя (для представления компании пользователя).это отношение не имеет ничего общего с отношением пользователей и компаний.

, поэтому я добавил свойство в модель пользователя:

[ForeignKey("company")]
[Display(Name = "Company")]
public int? Id_company { get; set; }

и свойство навигации:

public virtual Company company { get; set; }

, а в модели компании я добавил также навигациюсвойство:

public virtual ApplicationUser user { get; set; }

, но когда я пытаюсь обновить базу данных, я получаю эту ошибку:

ApplicationUser_company_Target:: множественность недопустима в роли ApplicationUser_company_Target в отношении ApplicationUser_company,Поскольку свойства зависимой роли не являются ключевыми свойствами, верхняя граница кратности зависимой роли должна быть '*'.

после поиска решения, я попытался украсить навигацию user.companiesсвойство с:

[InverseProperty("usuarios")]

, но это не помогло устранить ошибку ...

(дополнительная информация: обе модели находятся в разных пространствах имен, пользователь находится в myApp.Models, компанияв myApp.Models.DAL, но я думаю, что это не влияет на проблему ...)

1 Ответ

0 голосов
/ 27 февраля 2019

Насколько я понимаю, сообщение говорит вам о том, что ваш дизайн представляет отношение один к одному, и это должно быть отношение один ко многим.

Чтобы сделать это, вы должны изменить компаниюмодель от:

public virtual ApplicationUser user { get; set; }

Кому:

public virtual ICollection<ApplicationUser> user { get; set; }

Кроме того, у вас будет две пользовательские коллекции в модели вашей компании.

Как это

public partial class Company
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Company()
        {
            this.User = new HashSet<User>();
            this.User1 = new HashSet<User>();
        }

        public int Id { get; set; }
        public string Name { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<User> User { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<User> User1 { get; set; }
    }

Этот код был сгенерирован Entity Framework при первом обращении к базе данных.Используя эту модель базы данных .

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...