Прежде всего, я рекомендую использовать форму единственного числа для имен классов, так как EF автоматически приумножит имена таблиц.
Во-вторых, для ключевого свойства вы можете просто использовать термин Id, без любые аннотации, и EF выберет его в качестве основного ключа.
Наконец, я предполагаю, что вы хотите использовать подход Code-First. Рассмотрим следующие классы (ваши, но для ясности измененные):
public class Post
{
public virtual Guid Id { get; set; }
public virtual string UserName { get; set; }
public virtual User User { get; set; }
public virtual ICollection<PostLike> Likes { get; set; }
}
public class PostLike
{
public virtual Guid Id { get; set; }
public virtual Guid PostId { get; set; }
public virtual Post Post { get; set; }
public virtual string UserName { get; set; }
public virtual User User { get; set; }
}
public class User
{
public virtual Guid Id { get; set; }
public virtual string UserName { get; set; }
public virtual ICollection<Post> Posts { get; set; }
public virtual ICollection<PostLike> Likes { get; set; }
}
Чтобы это работало, вам понадобится DbContext, например, следующий. Обратите внимание на метод OnModelCreating, где волхвы c происходят:
public class ApplicationDbContext
: DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<Post> Posts { get; set; }
public DbSet<PostLike> PostLikes { get; set; }
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>()
.HasAlternateKey(u => u.UserName);
modelBuilder.Entity<User>()
.HasMany(u => u.Posts)
.WithOne(p => p.User);
modelBuilder.Entity<Post>()
.HasOne(p => p.User)
.WithMany(u => u.Posts)
.HasForeignKey(p => p.UserName)
.HasPrincipalKey(u => u.UserName);
modelBuilder.Entity<Post>()
.HasMany(p => p.Likes)
.WithOne(pl => pl.Post);
modelBuilder.Entity<PostLike>()
.HasOne(pl => pl.Post)
.WithMany(p => p.Likes);
modelBuilder.Entity<PostLike>()
.HasOne(pl => pl.User)
.WithMany(u => u.Likes)
.HasForeignKey(pl => pl.UserName)
.HasPrincipalKey(u => u.UserName);
}
}
Вуаля! Я надеюсь, что он отвечает на ваш вопрос;) Если это так, пожалуйста, не забудьте пометить мой пост как ответ!
Редактировать:
Я приведу некоторые объяснения , что я упустил, чтобы ответить на ваш вопрос как можно скорее.
Итак, первое, что вам нужно сделать, это объявить имя пользователя в качестве альтернативного ключа, потому что вы хотите создать отношения в зависимости от него, и вы уже объявить основной ключ 'Id'.
Во-вторых, для каждого объекта, которому должна принадлежать база ссылок пользователей на альтернативном ключе UserName, необходимо объявить свойство UserName объекта как внешний ключ отношения, и свойство UserName пользователя в качестве основного ключа.
Другими словами, внешний ключ - это свойство, которое ссылающийся объект использует для отношения, и главный ключ это свойство, на основе которого указанный объект связан с ссылающимся объектом.
Обратите внимание, что главные ключи должны иметь ключ или * 103 3 * ограничение альтернативного ключа , иначе оно не будет работать.