私はC#で最初にEntity Framework Codeを使用していますが、追跡に使用されるのと同じ列を持つエンティティが多数あります。私が使用している列は、Active、IsDeleted、CreatedBy、ModifiedBy、DateCreated、およびDateUpdatedです。追跡したいすべてのエンティティにこれらのプロパティを追加するのは面倒なようです。以下のような、エンティティが継承できる基本クラスが必要です。
public abstract class TrackableEntity
{
public bool Active { get; set; }
public bool IsDeleted { get; set; }
public virtual User CreatedBy { get; set; }
public virtual User ModifiedBy { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateModified { get; set; }
}
次に、エンティティのこのクラスから継承してこれらのプロパティを取得し、データベースが生成されると、エンティティごとにこれらの列が作成されます。
public class UserProfile : TrackableEntity, IValidatableObject
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public bool IsValid { get { return this.Validate(null).Count() == 0; } }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (String.IsNullOrEmpty(FirstName))
yield return new ValidationResult("First name cannot be blank", new[] { "Username" });
if (String.IsNullOrEmpty(LastName))
yield return new ValidationResult("Last cannot be blank", new[] { "Password" });
//Finish Validation Rules
}
}
私は本当にコードの重複を減らし、このようなある種のメソッドを使用したいのですが、これを機能させることができません。私は以下のエラーを受け取り続けます:
タイプ'Namespace.Models.User'と'Namespace.Models.User'の間の関連付けの主な終わりを判別できません。この関連付けの主な目的は、リレーションシップフルーエントAPIまたはデータアノテーションのいずれかを使用して明示的に構成する必要があります。
私は数日間探し回っていますが、やりたいことの答えが見つかりません。すべてがリンクする別のテーブルを作成したくありません。TPT、TPH、TPCについて読みました。TPCは私が望むものにかなり近いように見えましたが、ほとんどすべてのテーブルでPKを共有することは、私が絶対にやりたくないことです。
これが私のテーブルをどのように見せたいかの例です。これらのテーブルは、TrackableEntityから継承するエンティティによって作成されます。
[UserProfile]
[Id] [int] IDENTITY(1,1) NOT NULL
[FirstName] [varchar](50) NOT NULL
[LastName] [varchar](50) NOT NULL
[Email] [varchar](255) NOT NULL
[Phone] [varchar](20) NOT NULL
[CreatedBy] [int] NOT NULL
[ModifiedBy] [int] NOT NULL
[DateCreated] [datetime] NOT NULL
[DateModified] [datetime] NOT NULL
[Active] [bit] NOT NULL
[IsDeleted] [bit] NOT NULL
[CaseType]
[Id] [int] IDENTITY(1,1) NOT NULL
[Name] [varchar](50) NOT NULL
[CreatedBy] [int] NOT NULL
[ModifiedBy] [int] NOT NULL
[DateCreated] [datetime] NOT NULL
[DateModified] [datetime] NOT NULL
[Active] [bit] NOT NULL
[IsDeleted] [bit] NOT NULL