はこのような何かをすることが可能です:EFコアベースのエンティティクラスの継承と読み取り専用のプロパティ
public abstract class BaseEntity : IEntity
{
private Guid _id;
private DateTime _createdOn;
private DateTime _modifiedOn;
private byte[] _timestamp;
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id => _id;
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime CreatedOn => _createdOn;
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime ModifiedOn => _modifiedOn;
[Timestamp]
public byte[] Timestamp => _timestamp;
}
これは、基本クラスで、すべてのエンティティは、このクラスから継承する必要があります。また、このプロパティはreadonly(私はbacking propertiesを使用しています)である必要があります。なぜなら、EFはそれらを処理する必要があるからです。
public class Category : BaseEntity
{
[Required]
public string Name { get; set; }
public string Description { get; set; }
}
OnModelCreating
は空です。 私はマイグレーションを実行すると、私はメッセージを取得:
「エンティティタイプは 『Project.Database.Models.Category』が定義されるように、主 キーが必要です。
これはバッキングフィールドで処理しないでください。次に、バッキングフィールドを使用する必要がありますか? –
バッキングフィールドは_idであり、どちらのメソッド実装でも使用されています。ただし、バッキングフィールドはデータベース列にマップされているものではありません。プロパティはです。バッキングフィールドは、Entity Framework(および他のすべてのもの)が何も知らない/気にすることのないモデルクラス内のプライベートなメカニズムです。 – Pat
オブジェクトが作成されるとバッキングフィールドが設定され、プロパティはEFがデータベースにマップするものです。なぜこれがうまくいかないのかまだ分かりません。 "バッキングフィールドが設定されている場合、EFはプロパティセッターを使用するのではなく、データベースのエンティティインスタンスをマテリアライズするときに、そのフィールドに直接書き込みます。データベースからロードされる既存のエンティティの初期プロパティ値を設定するときに実行されます。" - ef core docs –