Как создать двустороннюю связь между двумя таблицами в Entity FrameWork - PullRequest
0 голосов
/ 15 мая 2018

У меня есть две таблицы, в которых я хочу создать отношение 1-n от User до Contact и обратное в EF.Это означает, что мне нужно двухстороннее отношение к двум пунктам назначения, так как они также являются базовой таблицей.Таблица Contact в пользовательском классе должна быть представлена ​​как ICollection, поэтому мои отношения нарушаются, и оба они являются одной стороной. проверьте эту картинку Но если я уберу ICollection, все будет правильно.

Как мне решить эту проблему?

  public class User
  {
    [Key]
    public Guid Id {get; set;}       
    [ForeignKey("ContactId")]
    public virtual ICollection<Contact> Contacts {get; set;}        
    public Guid? ContactId {get;set;}
  }

  public class Contact
  {
    [Key]
    public Guid Id {get; set;}
    [ForeignKey("UserId")]
    public virtual User User {get; set;}
    public Guid? UserId {get; set;}
  }

если я удалю внешний ключ контакта проверьте эту картинку :

я хочу еще одно отношениемежду этими таблицами, но в другом направлении. проверьте эту картинку

Ответы [ 3 ]

0 голосов
/ 15 мая 2018
  public class User
  {
    [Key]
    public Guid Id {get; set;}       
   // [ForeignKey("ContactId")]
    public virtual ICollection<Contact> Contacts {get; set;}        
   // public Guid? ContactId {get;set;}
  }

1-я сторона отношения 1-n не имеет внешнего ключа.

0 голосов
/ 15 мая 2018

Если вам нужно отношение 1-n от пользователя к контакту, вам нужно дополнительное свойство навигации. Чтобы быть уверенным в поведении EF, вы также можете настроить модель. Это пример.

[Table("User78")]
public class User
{
    [Key]
    public int Id { get; set; }
    public virtual ICollection<Contact> Contacts { get; set; }
    public virtual User MyPreferredUser { get; set; }
}

[Table("Contact78")]
public class Contact
{
    [Key]
    public int Id { get; set; }
    public virtual User User { get; set; }
}

public class Context : DbContext
{
    public Context()
    { }

Это контекстная конфигурация

    public Context(DbConnection connection)
        : base(connection, true)
    { }

    public DbSet<User> Users { get; set; }
    public DbSet<Contact> Contacts { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasMany(_ => _.Contacts)
            .WithOptional(_ => _.User)
            .Map(_ => _.MapKey("UserId"));

        modelBuilder.Entity<User>()
            .HasOptional(_ => _.MyPreferredUser)
            .WithMany()
            .Map(_ => _.MapKey("ContactId"));
    }
}

в этом примере вы не можете переходить от контакта к пользователю, используя отношение MyPreferredUser. Если вам нужно, вам нужно добавить новую навигацию от контакта к пользователю (типа ICollection).

Это DML, сгенерированный EF во время миграции

ExecuteNonQuery==========
CREATE TABLE [Contact78] (
 [Id] int not null identity(1,1)
, [UserId] int null
);
ALTER TABLE [Contact78] ADD CONSTRAINT [PK_Contact78_a31c6496] PRIMARY KEY ([Id])
ExecuteNonQuery==========
CREATE TABLE [User78] (
 [Id] int not null identity(1,1)
, [ContactId] int null
);
ALTER TABLE [User78] ADD CONSTRAINT [PK_User78_a31c6496] PRIMARY KEY ([Id])
ExecuteNonQuery==========
CREATE INDEX [IX_UserId] ON [Contact78] ([UserId])
ExecuteNonQuery==========
CREATE INDEX [IX_ContactId] ON [User78] ([ContactId])
ExecuteNonQuery==========
ALTER TABLE [Contact78] ADD CONSTRAINT [FK_Contact78_User78_UserId] FOREIGN KEY ([UserId]) REFERENCES [User78] ([Id])
ExecuteNonQuery==========
ALTER TABLE [User78] ADD CONSTRAINT [FK_User78_User78_ContactId] FOREIGN KEY ([ContactId]) REFERENCES [User78] ([Id])
0 голосов
/ 15 мая 2018

Есть много способов достичь этого. Вы можете сделать это следующим образом

  public class User
  {
    [Key]
    public Guid Id {get; set;}
    public virtual ICollection<Contact> Contacts { get; set; }
  }

  public class Contact
  {
    [Key]
    public Guid Id {get; set;}
    public virtual User User {get; set;}
  }

OR

Вы также можете попробовать этот способ

  public class User
  {
    [Key]
    public Guid UserId {get; set;}
    public virtual ICollection<Contact> Contacts { get; set; }
  }

  public class Contact
  {
    [Key]
    public Guid Id {get; set;}
    public Guid UserId {get; set;}
    public virtual User User {get; set;}
  }

Включает свойство внешнего ключа UserId

Для получения дополнительной информации вы можете перейти по этой ссылке

...