Saya mencoba memodelkan kelas pesan, untuk pesan pribadi untuk pengguna, menggunakan migrasi kode pertama.

public class Message
{
     public int MessageId { get; set; }

    [Required]
    public string MessageForUserId { get; set; }
    public virtual ApplicationUser MessageForUser { get; set; }

    [Required]
    public string MessageFromUserId { get; set; }

    public virtual ApplicationUser MessageFromUser { get; set; }

    [Required]
    public string MessageContent { get; set; }

    public bool MessageRead { get; set; }

    [Required]
    public DateTime MessageCreatedOn { get; set; }

    public DateTime? MessageReadOn { get; set; }
}

Dan di kelas ApplicationUser saya telah menambahkan dua koleksi

public class ApplicationUser : IdentityUser
{
    // other properties removed for brevity
    public ICollection<Message> UserMessages { get; set; }
    public ICollection<Message> SentMessages { get; set; }
}

Ketika saya melakukan migrasi, saya tidak hanya mendapatkan MessageFrom dan MessageFor Id, dua Id tambahan ditambahkan ApplicationUser_Id dan ApplicationUser _Id1 ke tabel Message.

Saya tahu ini karena mereka adalah dua kunci asing dalam pesan. Anotasi kunci asing dikomentari sekarang karena saya mendapatkan kesalahan dalam migrasi.

Ini adalah kesalahan ketika ForeignKeys aktif dan saya mencoba bermigrasi.

Tidak dapat menentukan hubungan yang diwakili oleh properti navigasi 'ApplicationUser.UserMessages' dari jenis 'ICollection'. Konfigurasikan hubungan secara manual, atau abaikan properti ini menggunakan atribut '[NotMapped]' atau dengan menggunakan 'EntityTypeBuilder.Ignore' di 'OnModelCreating'.

Saya ingin menggunakan anotasi yang lancar untuk mendefinisikan kelas ini dalam metode OnModelCreating tetapi saya tidak yakin bagaimana melakukannya dengan benar. Saya jelas tidak mengerti mengapa EF Code First tidak menentukan hubungan.

Masalahnya adalah saya tidak yakin bagaimana mendefinisikan kunci asing kelas pesan. Setiap pesan melibatkan dua pengguna yaitu pengirim dan penerima. Saya berpikir untuk membagi pesan menjadi dua kelas, MessageSent dan MessageReceived tetapi itu tidak akan membantu karena masing-masing akan memiliki pengirim dan penerima juga.

Bantuan apa pun tentang cara mendefinisikan ini dengan benar menggunakan anotasi yang lancar akan dihargai.

Pembaruan:

Mengikuti rekomendasi Dominick dan referensi posting sebelumnya, saya telah mencoba yang berikut ini yang tidak berfungsi.

Ini adalah kode DbSet

 public DbSet<Message> Messages { get; set; }
 public DbSet<ApplicationUser> AppUsers { get; set; }

Dan di OnModelCreating

 builder.Entity(typeof(Message))
            .HasOne(typeof(ApplicationUser), "MessageFromUser")
            .WithMany()
            .HasForeignKey("MessageFromUserId")
            .OnDelete(DeleteBehavior.Restrict); // no ON DELETE

 builder.Entity(typeof(Message))
            .HasOne(typeof(ApplicationUser), "MessageForUser")
            .WithMany()
            .HasForeignKey("MessageForUserId")
            .OnDelete(DeleteBehavior.Cascade); // set ON DELETE CASCADE

Saya mendapatkan kesalahan yang sama seperti yang disebutkan di atas, meskipun opsi pembuatnya masuk akal. Entitas memiliki satu jenis ApplicationUser, MessagesFromUser, bisa ada banyak dan id foreignkey sudah benar. Hal yang sama berlaku untuk properti lainnya.

1
dinotom 14 November 2017, 03:12

1 menjawab

Jawaban Terbaik
builder.Entity<Message>()
    .HasOne(x => x.MessageForUser)
    .WithMany(x => x.UserMessages)
    .HasForeignKey(x => x.MessageForUserId)
    .OnDelete(DeleteBehavior.Cascade);

builder.Entity<Message>()
    .HasOne(x => x.MessageFromUser)
    .WithMany(x => x.SentMessages)
    .HasForeignKey(x => x.MessageFromUserId)
    .OnDelete(DeleteBehavior.Cascade);
1
ceferrari 14 November 2017, 03:20