0

クライアントと住所の間には 1 対 1 の関係があります。私の理解では、私が持っているOnModelCreating方法をいじくり回さなければなりません。これで、アプリケーションを実行する準備が整いましたが、データベースを適切に初期化する必要があります。しかし、私はエラーが発生しています。

主な計画は、最初にクライアントを作成し、後でそれらに関連付けるアドレスを作成することです。

これが私のコンテキストクラスです:

public class VolumeV2Context : DbContext
{
    public DbSet<GiftCard> GiftCards { get; set; }
    public DbSet<Clients> Clients { get; set; }
    public DbSet<Address> Address { get; set; }              

         // use if you need to drop the database
         static VolumeV2Context(){

     // use if need to reset the models
     // Database.SetInitializer(new DropCreateDatabaseIfModelChanges<VolumeV2Context>());

     // use to reset whole database tables
      Database.SetInitializer(new DropCreateDatabaseAlways<VolumeV2Context>());

    }


    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Clients>()
            .HasOptional(j => j.Address)
            .WithOptionalDependent()
            .WillCascadeOnDelete(true);

        modelBuilder.Entity<Address>()
            .HasRequired(j => j.client)
            .WithRequiredDependent()
            .WillCascadeOnDelete(true) ;                           


        base.OnModelCreating(modelBuilder);
    }
}

モデル

public class Address
{
    [Required]
    public int Id { get; set; }

    [DataType(DataType.Text)]
    [Display(Name = "Street Address")]
    public string StreetAddress { get; set; }

    [DataType(DataType.Text)]
    [Display(Name = "Postal Code")]
    public string PostalCode { get; set; }

    [DataType(DataType.Text)]
    public string City {get; set; }

    [DataType(DataType.Text)]
    public string Province {get; set;}

    public virtual Clients client { get; set; }

}
public class Clients
{
    [Required]
    public long Id { get; set; }

    [Required]
    [DataType(DataType.Text)]
    [Display(Name = "First Name")]
    public string FirstName { get; set; }

    [Required]
    [DataType(DataType.Text)]
    [Display(Name = "Last Name")]
    public string LastName { get; set; }

    [Required]
    [DataType(DataType.PhoneNumber)]
    [Display(Name = "Phone ")]
    public string PhoneNumber { get; set; }

    public virtual Address Address {get; set;}

    [Display(Name = "Email List")]
    public Boolean EmailList { get; set; }

    [DataType(DataType.EmailAddress)]
    [Display(Name = "E-mail")]
    public string Email { get; set; }

    [DataType(DataType.Text)]
    [Display(Name = "Hair Type")]
    public string HairType { get; set; }        

   [DataType(DataType.MultilineText)]
    public string Description { get; set; }
}

メインのインデックスメソッドにあるデータベースへの最初の呼び出しで

return View(db.Clients.Take(25).ToList());

次のようなエラーが返されます。

テーブル 'Addresses' に FOREIGN KEY 制約 'FK_dbo.Addresses_dbo.Clients_client_Id' を導入すると、サイクルまたは複数のカスケード パスが発生する可能性があります。ON DELETE NO ACTION または ON UPDATE NO ACTION を指定するか、他の FOREIGN KEY 制約を変更します。制約を作成できませんでした。以前のエラーを参照してください。

4

1 に答える 1

3

問題は、双方向のカスケード削除があることです。言い換えれば、クライアントを削除するとアドレスが削除され、アドレスが削除されるクライアントが削除されます... 写真が表示されます。

データモデルを見るだけで、クライアントのアドレスが削除された場合、クライアントを削除しない方が理にかなっているではないでしょうか (人々は常に移動します:-))。または、アドレスを削除するとクライアントも一掃される理由がありますか (結局のところ、データモデルはアドレスがオプションであると言います....)

行をコメントアウトする場合:

   modelBuilder.Entity<Address>()
    .HasRequired(j => j.client)
    .WithRequiredDependent()
    .WillCascadeOnDelete(true) ;     

、または WillCascadeOnDelete を false にしますが、機能しますか?

別のオプションは、カスケード削除規則を完全にオフにすることです...

   modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

しかし、それはあなたがここでやりたいことだとは思いません...

于 2013-03-05T21:51:26.637 に答える