首页 > 解决方案 > “NameOfProperty”不能用作实体类型“NameOfType”的属性,因为它被配置为导航

问题描述

我有一个带有 Ship and Reservations 导航属性的 DB 预订和船类,

    public class Reservation {
        public Reservation() {
            Ship = new Ship();
        }
        public int Id { get; set; }
        public DateTime FromDate { get; set; }
        public DateTime ToDate { get; set; }
       [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public Ship Ship { get; set; }
   }

    public class Ship {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Port{ get; set; }
        public List<Reservation> Reservations { get; set; }
    }

DBcontext.cs 文件:

        protected override void OnModelCreating(ModelBuilder modelBuilder) {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<Reservation>().HasOne(r => r.Ship).WithMany(s => s.Reservations);
            modelBuilder.Entity<Reservation>().HasOne(u => u.Person).WithMany(r => r.Reservations);
            modelBuilder.Entity<Ship>().HasMany(res => res.Reservations).WithOne(s => s.Ship);

            //This line generates the error
            modelBuilder.Entity<Reservation>().Property(a => a.Ship).ValueGeneratedNever();
        }

        public DbSet<Reservation> Reservations { get; set; }
        public DbSet<Ship> Ships { get; set; }
    }
}

我添加这条产生错误的行和下面的 executeSqlRawAsync 方法的原因是我试图解决这个错误: Microsoft.Data.SqlClient.SqlException (0x80131904): Cannot insert explicit value for identity column in table 'Ships' when IDENTITY_INSERT设置为关闭。我想在数据库中创建一个带有船的预订,但我无法插入值。所以我尝试用这个 ValueGeneragtedNever 方法和 executeRawSql 方法修复它,但它给了我标题中的错误。

public async Task CreateReservation(ReservationGetDTO reservationDTO)
        {
            await _context.Database.ExecuteSqlRawAsync("SET IDENTITY_INSERT [dbo].[Reservations] ON");
            _context.Reservations.Add(Mapper.Map(reservationDTO, new Reservation()));
            await _context.SaveChangesAsync();
            await _context.Database.ExecuteSqlRawAsync("SET IDENTITY_INSERT [dbo].[Reservations] OFF");
        }

任何想法我错过了什么?

标签: c#entity-framework.net-coreentity-framework-coreblazor

解决方案


修复保留类,删除 [DatabaseGenerated(DatabaseGeneratedOption.None)] 和构造函数

public class Reservation {
       
        public int Id { get; set; }
        public DateTime FromDate { get; set; }
        public DateTime ToDate { get; set; }

        public int ShipId { get; set; }
        public virtual  Ship Ship { get; set; }
   }

    public class Ship {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Port{ get; set; }
        public virtual  ICollection<Reservation> Reservations { get; set; }
    }

并且由于您使用的是 ef core 5+ 从 dbcontext 中删除所有流畅的 API,因此您不需要它们

并尝试使用此代码添加新项目

public async Task CreateReservation(ReservationGetDTO reservationDTO)
        {
           
          _context.Reservations.Add(Mapper.Map(reservationDTO, new Reservation()));
            await _context.SaveChangesAsync();
           
        }

推荐阅读