質問:ON DELETE CASCADE
オプションをベーステーブルの流暢なAPIを使用して外部キー制約に指定するにはどうすればよいですか?私は他のテーブルとの関係でそれを行う方法を知っていますが、どのようにTPT(Table Per Type)テーブルのためにこれを生成させるのですか?流暢なAPIを使ってベーステーブルのカスケード削除をどのように指定しますか?
説明: 私は外部キーの関係を指しているわけではありません。私のDbContextでは、エンティティのマッピングオブジェクトを常に使用しています。なぜなら、ほとんどの場合、慣習的なアプローチを受け入れるのとは対照的に明示的であることが望ましいからです。つまり、TPTテーブルのすべての設定は、EntityTypeConfiguration<SomeEntityClass>
クラスで処理されています。
別のクラスから派生した新しいクラスを作成してTPT関係を定義すると、ON DELETE CASCADE
は問題であるSQL制約に生成されません。
は、上記のコードは本当に簡単です
public class Person
{
public int PersonId { get; set; }
public string Name { get; set; }
}
public class OtherPerson : Person
{
public string SomeOtherProperty { get; set; }
}
public class PersonMap : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<Person>
{
public PersonMap()
{
this.HasKey(t => t.PersonId); // Primary Key
this.Property(t => t.PersonId)
.HasColumnName("PersonId") // Explicitly set column name
.IsRequired() // Field is required/NOT NULL
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); // Specify as Identity (Not necessary, but I'm explicit)
this.Property(t => t.Name)
.HasColumnName("Name") // Explicitly set column name
.IsRequired() // Field is required/NOT NULL
.HasMaxLength(50); // Max Length
this.ToTable("People"); // Map to table name People
}
}
public class OtherPersonMap : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<OtherPerson>
{
public OtherPersonMap()
{
this.Property(t => t.SomeOtherProperty)
.HasColumnName("SomeOtherProperty") // Explicitly set column name
.IsRequired() // Field is required/NOT NULL
.HasMaxLength(10); // Max Length
this.ToTable("OtherPeople"); /* Map to table name OtherPeople
* This also causes TPT to create a shared primary key from the base table
* and double serving as a foreign key to base table.
*/
}
...次のコードを見てください。私は2つのタイプがあり、それらは正しくデータベースに作成されます。新しいOtherPerson
を作成してデータベースに保存すると、最初にPeople
テーブルのレコードとOtherPeople
テーブルのレコードが2つのレコードを作成します。これは、OtherPeopleからPeopleへの外部キーでもある共有プライマリキーです。 DbContextまたはEFでは、コード内のOtherPersonを削除すると、どちらのレコードも正しく削除されます。ただし、データベースからレコードを直接削除すると、孤立したレコードがPeople
テーブルに残されます。
したがって、流暢なAPIを使用してベーステーブルに対して生成された外部キー制約に、ON DELETE CASCADE
を指定するにはどうすればよいですか?
申し訳ありません申し訳ありませんが、長すぎますが、私は自分の問題ができる最高のものを記述したかっただけです。 ありがとうございます。
お返事ありがとうございます。私は本当にapiを通じてそれを設定する方法があることを望んでいた。データベースに手動で作成すると思います。再度、感謝します。 –