繁体   English   中英

EF Core基础实体类的继承和只读属性

[英]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属性提供publicinternalprotected (但不是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM