Реализация связи многие ко многим EntityFrameworkCore
Имеется следующий контекст SCtx:
class SCtx : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Job> Jobs { get; set; }
public SCtx()
{
Database.EnsureDeleted();
Database.EnsureCreated();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=helloappdb;Trusted_Connection=True;");
}
}
public class User
{
public Int32 Id { get; set; }
public String Name { get; set; }
public ICollection<Job> Jobs { get; set; }
public User()
{
Jobs = new List<Job>();
}
}
public class Job
{
public Int32 Id { get; set; }
public String Value { get; set; }
public ICollection<User> Users { get; set; }
public Job()
{
Users = new List<User>();
}
}
И следующий код:
static void Main(string[] args)
{
SCtx DB = new SCtx();
User User1 = new User
{
Name = "User1" ,
Jobs=new List<Job>
{
new Job{Value="Job1"},
new Job{Value="job2"},
}
};
User User2 = new User
{
Name = "User2",
Jobs = new List<Job>
{
new Job{Value="Job2"},
new Job{Value="job3"},
}
};
DB.AddRange(User1, User2);
DB.SaveChanges();
}
Получается, что при создании БД я получаю две таблицы : Users и Jobs ,но ко всему прочему таблицу их связей JobUser. Проблема состоит в том ,что полученные таблицы будут выглядеть так:

То есть поскольку в каждом классе я добавляю new Job{} , то всегда создается новая строка в таблице.
Как реализовать простой механизм добавления User'a ,чтобы в таблице Jobs не было повторений, а именно:

Но при этом не хотелось бы расписывать связи ,как тут Связь многие ко многим Code First и работы с Fluent API
Ответы (1 шт):
Вы добавляете обоим юзерам разные задания с одинаковым значением.
Просто создайте это задание отдельно и назначьте его.
Job job2 = new Job { Value = "job2" };
User User1 = new User
{
Name = "User1",
Jobs = new List<Job>
{
new Job{Value="Job1"},
job2 // <--
}
};
User User2 = new User
{
Name = "User2",
Jobs = new List<Job>
{
job2, // <--
new Job{Value="job3"},
}
};
А если мне допустим на вход уже передали готовый класс User'a ,то как удобнее всего добавить его в БД так , что если данная работа уже есть в БД ,то она не будет повторно создана?
Это нужно решать следующим образом.
Сперва ищем в БД задание с таким же значением. Если нашли - добавляем юзеру именно его. Не нашли - создаём новое задание.
string value = "job2";
Job job = DB.Jobs.FirstOrDefault(j => j.Value == value);
if (job == null)
job = new Job { Value = value };
User user = new User();
user.Jobs.Add(job);