[英]EF Core base entity class inheritance and readonly properties
是否可以做这样的事情:
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;
}
这是基类,所有实体都应从此类继承。 另外,此属性应该是只读的(我正在使用backing属性 ),因为EF需要照顾它们。
public class Category : BaseEntity
{
[Required]
public string Name { get; set; }
public string Description { get; set; }
}
并且OnModelCreating
为空。 运行迁移时,我收到消息:
'实体类型'Project.Database.Models.Category'需要定义主键。
这似乎是一个错误,因为如果您为Id
属性提供public
, internal
或protected
(但不是private
或没有)setter,或者如果您通过Fluent API显式指定了派生实体的键,那么它将起作用
modelBuilder.Entity<Category>().HasKey(e => e.Id);
当然,这违背了使用基类属性的全部目的。
您可以考虑将其报告给EF Core GitHub 。
问题是您的BaseEntity.Id属性是只读的。
您的Id属性被实现为表达式主体成员 (=>语法),这仅仅是get-only属性的语法糖。
因此,您的代码:
public Guid Id => _id;
等效于:
public Guid Id { get { return _id; } }
EF必须能够设置映射属性的值。 您将必须使用传统语法来实现该属性,并且必须提供一个setter。 如果上下文与模型位于同一程序集中,则可以将setter标记为内部,以便该属性仅在程序集外部读取。 如果上下文在其他程序集中,则仍可以将setter标记为内部,然后使用InternalsVisibleTo属性使内部对包含上下文的程序集可见。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.