[英]EF CORE 5.0.1 Configuring abstract class to be ignored as an model entity but access its properties in derived models
我有一個抽象基礎 class ,它是所有派生(~100)類的基礎。 此基礎 class不應保存到數據庫中,但其屬性應作為派生類 -> 實體模型中的列公開。 在 Db 上下文代碼(OnModel Creation 等)中,沒有提及 BaseEntity - 僅提及其派生類。
在 3.0.1 中,這很好用。 BaseEntity 被忽略,僅提到的類(通過 DbSet 或 OnModelxxx 中)被配置為 TPH。
System.InvalidOperationException:無法為“BaseEntity”創建 DbSet,因為此類型未包含在上下文的 model 中。
我如何恢復以前的行為?
我的基礎 class:
public abstract class BaseEntity
{
[Key]
[GraphQLName("id")]
[GraphQLNonNullType(IsNullable = true)]
public Guid Identifier { get; set; } = Guid.NewGuid();
[GraphQLNonNullType(IsNullable = true)]
public DateTime CreatedDate { get; set; } = DateTime.UtcNow;
[GraphQLNonNullType(IsNullable = true)]
public DateTime LastModifiedDate { get; set; } = DateTime.UtcNow;
[GraphQLNonNullType(IsNullable = true)]
public DateTime DisplayDate { get; set; } = DateTime.UtcNow;
public string DisplayName { get; set; } = string.Empty;
public string DisplayText { get; set; } = string.Empty;
public string DisplayDescription { get; set; } = string.Empty;
public string TypeName { get; set; }
}
......
示例派生類:
public class Document : BaseEntity
{
[GraphQLIgnore]
public Organization Organization { get; set; }
[GraphQLNonNullType(IsNullable = true)]
public DocumentType DocumentType { get; set; }
/// <summary>
/// Mimetype of the document
/// </summary>
[GraphQLName("type")]
[GraphQLNonNullType(IsNullable = true)]
public string MimeType { get; set; }
}
保存代碼 - 使用 BaseEntity - 在 SaveChangesAsync() 上引發異常
public async Task<List<T>> Upsert<T>(List<T> baseEntities, bool isRaiseBaseEntityChangeEvent = true) where T : class
{
var entities = new HashSet<BaseEntity>();
foreach (var b in baseEntities)
{
entities.Add(b as BaseEntity);
TraverseGraph(b as BaseEntity, ref entities);
}
using (var context = GetDbInstance())
{
try
{
foreach (var e in entities)
{
//exists in db
if (e.IsPersistedToDatabase == true)
{
context.Attach(e);
foreach (var entry in context.Entry(e).Properties)
{
try
{
if (entry.Metadata.Name.Equals("CreatedDate"))
{
// Don't allow changing the CreatedDate on existing objects.
entry.IsModified = false;
}
else if (entry.CurrentValue != null && !entry.Metadata.IsPrimaryKey())
{
entry.IsModified = true;
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message);
continue;
}
}
}
else
{
e.IsPersistedToDatabase = true;
context.Set<BaseEntity>().Add(e);
}
}
//make a copy for the change event
List<BaseEntityEntry> baseEntries = new List<BaseEntityEntry>();
foreach (var e in context.ChangeTracker.Entries())
baseEntries.Add(new BaseEntityEntry()
{
Entity = e.Entity as BaseEntity,
State = e.State
});
await context.SaveChangesAsync();
#region BaseEntity change event raising
if (isRaiseBaseEntityChangeEvent)
{
EventsPublisher.Instance.SignalEntityChange(new BaseEntityChangeEventArgs()
{
Entities = baseEntries
});
}
#endregion
return baseEntities;
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message);
throw ex;
}
}
}
ontext.Set<BaseEntity>()
肯定是錯的。
要么使用
context.Add(e);
或者
context.Set<{ConcreteType}>.Add(e);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.