Wenn Sie Attributes
mögen (genau wie ich) und EF Core verwenden, könnten Sie folgenden Ansatz verwenden.
Zuerst erstellen Sie ein Attribut, um private Eigenschaften zu kennzeichnen:
using System;
using System.ComponentModel.DataAnnotations.Schema;
...
[System.AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
public sealed class ShadowColumnAttribute : ColumnAttribute
{
public ShadowColumnAttribute() { }
public ShadowColumnAttribute(string name): base(name) { }
}
public static class ShadowColumnExtensions
{
public static void RegisterShadowColumns(this ModelBuilder builder)
{
foreach (var entity in builder.Model.GetEntityTypes())
{
var properties = entity.ClrType
.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic)
.Select(x => new { prop = x, attr = x.GetCustomAttribute() })
.Where(x => x.attr != null);
foreach (var property in properties)
entity.AddProperty(property.prop);
}
}
}
Dann markieren Sie die Eigenschaften, die privat bleiben sollen.
public class MyEntity
{
[Key]
public string Id { get; set; }
public bool SomeFlag { get; set; }
public string Name => SomeFlag ? _Name : "SomeOtherName";
[ShadowColumn(nameof(Name))]
string _Name { get; set; }
}
Zum Schluss fügen Sie dies am Ende Ihrer OnModelCreating
-Methode in Ihrem DbContext
ein:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// ...
builder.RegisterShadowColumns();
}