我们使用的是.NET Core 2.2
。我们在数据注释中使用了数据库优先的方法。我们有以下型号:
Issue.cs
[Table("issue", Schema = "abc")]
public partial class Issue
{
[Column("id")]
public int Id { get; set; }
[Column("summary")]
[StringLength(255)]
public string Summary { get; set; }
}
Issue.partial.cs
[ModelMetadataType(typeof(IssueMetaData))]
public partial class Issue
{
public bool IsPublic { get; set; }
}
public class IssueMetaData
{
[NotMapped]
public bool IsPublic { get; set; }
}
如果我运行以下查询。。。
var issue = _dbContext.Issue.FirstOrDefault(x => x.Id == 2406);
我得到以下错误:
Npgsql。PostgresException:"42703:列x.IsPublic不存在">
看起来元数据类被忽略了。如果我在Issue.partial.cs
中将[NotMapped]
移动到public partial class Issue
,则它正常工作。两个分部类都在同一个命名空间中。
我做错了什么?
ModelMetadataTypeAttribute
是ASP的一部分。NET核心,并存在于Microsoft.AspNetCore.Mvc
命名空间和相应的dll中。EF Core不依赖ASP。NET Core,所以它对这个属性一无所知,也无法对其进行分析。
正如@Ivan Stoev在评论中建议的那样,您可以在上下文中使用流利的API在OnModelCreating
方法中配置您的模型。类似这样的东西:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Issue>().Ignore(c => c.IsPublic);
}