我在 C# 中首先使用实体框架代码,并且我有许多实体具有用于跟踪的相同列。我使用的列是 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