Как создать свойство двусторонней навигации в рамках сущности? - PullRequest
0 голосов
/ 15 ноября 2018

Существует Cargo класс / таблица с идентификатором CargoID Существует ContainerIn класс / таблица, которая содержит CargoID

Каждый груз может иметь 1 или 0 соответствующих записей контейнера.Я пытаюсь создать такие свойства навигации, чтобы.Cargo.ContainerIn ---> должен дать мне связанную ContainerIn запись ContainerIn.Cargo ---> должен дать мне связанную Cargo запись

Класс груза:

public class Cargo
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CargoID { get; set; }//SerialNo
    [Required]
    public DateTime DateOfPassage { get; set; }
    public string CompanyUserName { get; set; }
    public virtual ContainerIn ContainerIn { get; set; }
}

ContainerIn Подкласс:

public class ContainerIn 
{
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int ContainerInID { get; set; }
  public int CargoID { get; set; }
  public virtual Cargo Cargo { get; set; }
  public int LoadStatus { get; set; }
}

Я также попытался добавить класс public int ContainerInID { get; set; } in Cargo`.Я все еще получаю:

`Unable to determine the principal end of an association between the types 'PisMark3.Models.Cargo.ContainerIn' and 
'PisMark3.Models.Cargo.Cargo'. 
The principal end of this association must be explicitly configured
 using either the relationship fluent API or data annotations.`

РЕДАКТИРОВАТЬ: Я добавил OnModelCreating в ApplicationDbContext классе.

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<PisMark3.Models.Cargo.Cargo>()
                        .HasOptional(s => s.ContainerIn)
                        .WithRequired(ad => ad.Cargo);
        }
        public ApplicationDbContext()
            : base("DefaultConnection", throwIfV1Schema: false)
        {
            //  Database.SetInitializer<ApplicationDbContext>(new DropCreateDatabaseIfModelChanges<ApplicationDbContext>());
        }
    .... 

Теперь я получаю: enter image description here

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

не может определить основной конец ассоциации между типа PisMark3.Models.Cargo.ContainerIn и 'PisMark3.Models.Cargo.Cargo. Основной конец этой ассоциации должен быть явно сконфигурирован с использованием любого API-интерфейса или аннотации данных

Это говорит вам, чтобы определить ваши отношения, потому что он не может понять отношения.

То, что вы ищете, это Отношение один-к-одному-одному вот ссылка

Это ваша модель,

 public class Cargo
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int CargoID { get; set; }//SerialNo
        [Required]
        public DateTime DateOfPassage { get; set; }
        public string CompanyUserName { get; set; }
        public virtual ContainerIn CompanyUserNameContainIn { get; set; }
    }

    public class ContainerIn
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ContainerInID { get; set; }        
        public int LoadStatus { get; set; }        
        public int CargoID { get; set; }        
        public virtual Cargo Cargo { get; set; }
    }

Это ваш код API,

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {           
            modelBuilder.Entity<Cargo>()
                        .HasOptional(s => s.CompanyUserNameContainIn) 
                        .WithRequired(ad => ad.Cargo); 
        }

Это сообщает объектной структуре, что она имеет необязательное название компании в модели и требуемой модели грузовое в ContainerIn

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

EDIT:

Поскольку вы хотите использовать identityDBContext, вы можете изменить свой код, как показано ниже

// You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
    public class ApplicationUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Add custom user claims here
            return userIdentity;
        }
    }

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
    {

        public virtual DbSet<Cargo> Cargo { get; set; }
        public virtual DbSet<ContainerIn> ContainerIn { get; set; }

        public ApplicationDbContext()
            : base("DefaultConnection")
        {
        }

        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {           
            modelBuilder.Entity<Cargo>()
                        .HasOptional(s => s.CompanyUserNameContainIn) 
                        .WithRequired(ad => ad.Cargo);

            modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
            modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
            modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });

        }

    }
0 голосов
/ 15 ноября 2018

ты довольно близко.Я думаю, вам нужно следующее:

    public class Cargo
    {
      [Key]
      [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
      public int CargoID { get; set; }//SerialNo
      [Required]
      public DateTime DateOfPassage { get; set; }
      public string CompanyUserName { get; set; }
      public int ContainerInId { get; set; } //need to define a foreign key. This is happening by naming convention in this case as with your `ContainerIn.CargoId` foreign key 
      public virtual ContainerIn ContainerIn { get; set; }
    }

    public class ContainerIn 
    {
      [Key]
      [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
      public int ContainerInID { get; set; }
      public int CargoID { get; set; }
      public virtual Cargo Cargo { get; set; }
      public int LoadStatus { get; set; }
    }

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

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

...