Ich habe Payments
und Reviews
.EF Eins-zu-Eins optionale Navigationseigenschaften der Beziehung funktioniert nicht
public class Payment {
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int PaymentId { get; set; }
[ForeignKey("Review")]
public int? ReviewId { get; set; }
public virtual Review Review { get; set; }
// other properties
}
public class Review {
[Key]
public int ReviewId { get; set; }
[ForeignKey("PeerPayment")]
public int? PeerPaymentId { get; set; }
public virtual PeerPayment PeerPayment { get; set; }
}
ich sie abgebildet haben, wie folgt:
public ReviewConfiguration() {
// One-to-One optional:optional
HasOptional(s => s.Payment).WithMany().HasForeignKey(x => x.PaymentId);
}
public PaymentConfiguration() {
// One-to-One optional:optional
HasOptional(s => s.Review).WithMany().HasForeignKey(s => s.ReviewId);
}
Meine Datenbank FKs als nullable
, geschaffen, die groß ist. Der folgende Test schlägt jedoch fehl:
public async Task ReviewPeerPaymentWorks() {
using (var db = new AppContext()) {
var user1 = db.FindUser("M1");
var user2 = db.FindUser("M2");
var review = new Review() {
FromUserId = user1.UserId,
ToUserId = user2.UserId
};
db.Reviews.Add(review);
var payment = new Payment() {
FromUserId = user1.UserId,
ToUserId = user2.UserId,
ReviewId = review.ReviewId
};
db.Payments.Add(payment);
db.SaveChanges();
review = db.Reviews.First(s => s.ReviewId == review.ReviewId);
payment = db.Payments.First(s => s.PaymentId == payment.PaymentId);
Assert.AreEqual(review.PaymentId, payment.PaymentId); // fails - review.PaymentId is always null
Assert.AreEqual(review.ReviewId, payment.ReviewId); // passes
Assert.AreEqual(review.Payment.PaymentId, payment.Review.PaymentId); // fails - review.Payment is null, payment.Review.PaymentId is null
}
}
Was mache ich falsch?
Um klar zu sein - ich möchte meinen Test nicht ändern, es sei denn jemand denkt, dass es ein ungültiger Weg ist, die Beziehung aus irgendeinem Grund zu testen.
[DatabaseGeneratedAttribute (DatabaseGeneratedOption.Identity)] fügen Sie diese Anmerkung in PaymentID Feld Zahltisch auch –
wieder, mischen Sie 'DataAnnotations' mit 'Fließende API'. warum so? Du hast auch gesagt, dass das eine Eins-zu-Eins-Beziehung ist. Aber Sie konfigurieren "Eins-zu-viele". In 'eins-zu-eins'-Beziehungen ist PK bei beiden gleich. –
@AdilMammadov aber beide Entitäten können unabhängig voneinander erstellt werden. Wie konfiguriere ich das so, dass beide Seiten optional sind? – RobVious