Home > Back-end >  csharp(CS1660) | "Cannot convert lambda expression to type 'bool' because it is not a
csharp(CS1660) | "Cannot convert lambda expression to type 'bool' because it is not a

Time:06-24

so I want to create the relationships between my Model classes (Booking and Person). I found a tutorial for that A Relationship example I found

My Model classes:

namespace BookADesk.API.Models
{
    public class Booking
    {
        public Guid Id { get; set; }
        public DateTime Start { get; set; }
        public DateTime End { get; set; }
        public Guid DeskId { get; set; }
        public Desk Desk { get; set; }
        public Guid PersonId { get; set; }
        public Person Persons { get; set; }
    }
}

namespace BookADesk.API.Models
{
    public class Person
    {
        public Guid Id { get; set; }
        public string Nickname { get; set; }
        public string SurName { get; set; }
        public string GivenName { get; set; }
        public ICollection<Booking> Bookings { get; set; }
    }
}

And here is my DbContext. The error comes from the 25th Line ".HasMany(b => b.Persons)".

using Microsoft.EntityFrameworkCore;
using System.Linq;
using System.Diagnostics.CodeAnalysis;
using BookADesk.API.Models;

namespace BookADesk.API.Models
{
    public class BookADeskContext : DbContext
    {
        public BookADeskContext(DbContextOptions options) 
        : base(options)
            {
            }

            public DbSet<Booking> Booking { get; set; } = null!;
            public DbSet<Desk> Desk { get; set; } = null!;
            public DbSet<Location> Location { get; set; } = null!;
            public DbSet<Person> Person { get; set; } = null!;
            public DbSet<Room> Room { get; set; } = null!;
            public DbSet<Zone> Zone { get; set; } = null!;

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Booking>()
                .HasMany(b => b.Persons)
                .WithMany(p => p.Bookings);

        }
    }
}

CodePudding user response:

Person has many Bookings (ICollection<Booking> Bookings) and Booking has one Person (Person Persons).

Also Booking has PersonId which means that one booking can belong to/depend on only ONE Person - this is the reason why .HasMany(b => b.Persons) does not work.

To have many-to-many relations Booking should have ICollection<Person> Persons (collection) (but as for me it doesn't make sense - how can one booking have many persons?).

So your mapping (one-to-many) should be:

 modelBuilder.Entity<Booking>()
     .HasOne(b => b.Persons) // consider renaming to Person
     .WithMany(p => p.Bookings)
     .HasForeignKey(b => b.PersonId);

Or if you need many-to-many you need to make changes in Booking entity:

public class Booking
{
    public Guid Id { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public Guid DeskId { get; set; }
    public Desk Desk { get; set; }
    public ICollection<Person> Persons { get; set; } // collection
    // PersonId is not here anymore
}

And mapping (or you can go with your mapping):

modelBuilder.Entity<Person>()
    .HasMany(p => p.Bookings)
    .WithMany(b => b.Persons);
  • Related