0

いくつかの予約とそのキャンセルのこの単純なデータ モデルがあります。

[Table("ReservationCreation")]
public class ReservationCreation
{
    [Key()]
    public int ReservationCreationId { get; set; }

    [InverseProperty("ReservationCreation")]
    public virtual ReservationCancellation ReservationCancellation { get; set; }
}

[Table("ReservationCancellation")]
public class ReservationCancellation
{
    [Key()]
    [ForeignKey("ReservationCreation")]
    public int ReservationCancellationId { get; set; }

    [Required]
    [ForeignKey("ReservationCancellationId")]
    [InverseProperty("ReservationCancellation")]
    public virtual ReservationCreation ReservationCreation { get; set; }
}

public class DbContext : System.Data.Entity.DbContext
{
    public DbContext() : base(@"DefaultConnection") { }
    public DbSet<ReservationCancellation> ReservationCancellation { get; set; }
    public DbSet<ReservationCreation> ReservationCreation { get; set; }
}

internal sealed class Configuration : DbMigrationsConfiguration<DbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
    }
}

これがテストのコードです。最初に予約が作成され、次にキャンセルされます。キャンセル レコードがデータベースに保存されると、「ReservationCreation フィールドが必要です」という例外がスローされます。予約の ID のみからキャンセル レコードを作成し、同時にナビゲーション プロパティを定義するにはどうすればよいですか?

class Program
{
    static void Main(string[] args)
    {
        int reservationId;

        // create reservation
        using (var db = new DbContext())
        {
            var reservation = 
                db.ReservationCreation.Add(
                    new ReservationCreation());
            db.SaveChanges();
            reservationId = reservation.ReservationCreationId;
        }

        // cancel reservation by its Id
        using (var db = new DbContext())
        {
            var cancellation =
                db.ReservationCancellation.Add(
                    new ReservationCancellation
                    {
                        ReservationCancellationId = reservationId
                    });
            try
            {
                // an exception is thrown
                db.SaveChanges();
            }
            catch(DbEntityValidationException ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.ToString());
                foreach (var err in ex.EntityValidationErrors.SelectMany(x_ => x_.ValidationErrors))
                    System.Diagnostics.Debug.WriteLine($"!!!ERROR!!! {err.PropertyName}: {err.ErrorMessage}");
            }
        }
    }
}

データ モデルの注釈を変更する方法が見つかりませんでした。ReservationCreation プロパティから [Required] を削除すると、移行を作成できません (またはそのデータ モデルでデータベースに接続できません)。

4

2 に答える 2

1

@dknaack の推奨事項に従いました。この問題の最終的な解決策は、次のデータ モデルです。

[Table("ReservationCreation")]
public class ReservationCreation
{
    [Key()]
    public int ReservationCreationId { get; set; }

    [InverseProperty("ReservationCreation")]
    public virtual ReservationCancellation ReservationCancellation { get; set; }
}

[Table("ReservationCancellation")]
public class ReservationCancellation
{
    [Key()]
    [ForeignKey("ReservationCreation")]
    public int ReservationCancellationId { get; set; }

    [ForeignKey("ReservationCancellationId")]
    public virtual ReservationCreation ReservationCreation { get; set; }
}
于 2016-11-22T00:46:45.630 に答える
1

Your mixing things up in your ReservationCancellation model.

In your ReservationCreation property you are referring to the primary key entity instead of the ReservationCreation property.

Try this.

[Table("ReservationCancellation")]
public class ReservationCancellation
{
    [Key()]
    public int ReservationCancellationId { get; set; }

    [ForeignKey("ReservationCreation")]
    public int ReservationCreationId { get; set; }

    [Required]
    public virtual ReservationCreation ReservationCreation { get; set;   }
}

Update

作成ごとに 1 つのキャンセルのみが必要なため、より単純なモデルを使用してこれを行うことができます。

[Table("ReservationCreation")]
public class ReservationCreation
{
    [Key()]
    public int ReservationCreationId { get; set; }

    public virtual ReservationCancellation ReservationCancellation { get; set; }
}

[Table("ReservationCancellation")]
public class ReservationCancellation
{
    [Key()]
    public int ReservationCancellationId { get; set; }

    public virtual ReservationCreation ReservationCreation { get; set; }
}
于 2016-11-21T12:58:33.613 に答える