我想創建包裝類int以在我的物體中使用它(它將在許多物體中使用,所以我想讓它盡可能易于使用)并配置物體框架以將其視為 SQL 中的整數(到避免僅創建新表來存盤這些值)例如:
public class SomeEntity
{
public long Id { get; set; }
public BoundedInteger SomeProperty { get; set; }
}
public class BoundedInteger
{
public const int MAX_VALUE = 100;
public const int MIN_VALUE = 0;
private int _value;
private int Value
{
get => _value;
set
{
if (value < MIN_VALUE || value > MAX_VALUE)
{
throw new ArgumentOutOfRangeException(nameof(value));
}
_value = value;
}
}
}
SomeEntity表架構:
Id INTEGER;
SomeProperty INTEGER; // (Use BoundedInteger.Value as SomeProperty value in SQL)
uj5u.com熱心網友回復:
對的,這是可能的。你需要做的是一個價值轉換器。
舉個例子,我有這個RowVersion 結構,如果我沒記錯的話,我只在 SQL Server 中測驗過,并且有一點需要糾正。但無論如何,這并不重要。
基本上,我想要的是將來自多個資料庫引擎的各種型別的時間戳封裝到這個單一結構中。您需要為它創建一個值轉換器。超級簡單。
首先創建價值轉換器。我在 DbContext 中執行此操作并將其保存為屬性,以便根據需要在盡可能多的列/屬性中重復使用。
public partial class DataContext : DbContext
{
#region Properties
// I deleted some irrelevant stuff from here.
/// <summary>
/// Gets the byte array-to-RowVersion converter.
/// </summary>
public ValueConverter<RowVersion, byte[]> RowVersionConverter { get; }
#endregion
#region Constructors
/// <summary>
/// Creates a new instance of this class.
/// </summary>
/// <param name="options">Options containing database connection information.</param>
public DataContext
(
IOptions<SqlServerOptions> options,
IDbConnectionFactory connection
)
{
Logger = Log.ForContext<DataContext>();
Options = options.Value;
DbConnectionFactory = connection;
RowVersionConverter = new ValueConverter<RowVersion, byte[]>
(
v => v.Value.Reverse().ToArray(),
v => new RowVersion(v)
);
}
#endregion
}
我在 DbContext 的建構式中創建了一個簡單的值轉換器,它由一個RowVersion獲取原始資料的建構式來輔助。
現在您所要做的就是指定它的用法。
partial void ConfigureLocationModel(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Location>(b =>
{
// Other properties here.
b.Property(m => m.RowVersion)
.HasColumnName("RowVersionCd")
.HasConversion(RowVersionConverter) // <---- Here
.IsRowVersion().IsConcurrencyToken();
});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/517088.html
