الخاصية التي يجب أن تكون حقل قاعدة بيانات للقراءة فقط (Fluent NHibernate Automapping)
-
13-12-2019 - |
سؤال
أنا أستخدم Fluent NHibernate مع وظيفة التخطيط التلقائي.أنا الآن أبحث عن شيء مثل التكوين أو الإعداد أو السمة المخصصة - أيًا كان - لإعلان خاصية الكيان على أنها "ReadOnlyFromDb"
في قاعدة بيانات MsSql، أستخدم عمودًا محسوبًا في أحد الجداول الخاصة بي حيث يتم حساب القيمة اعتمادًا على بعض القيم الأخرى لصف البيانات المحدد.لقد أعلنت الآن هذا العمود في فئة الكيان كـ
public virtual int STATUS { get; private set; }
عند الحصول على البيانات المحددة للجدول، كل شيء يعمل بشكل جيد.الملكية STATUS
يتم ملؤه بشكل صحيح بالقيمة المحددة في جدول البيانات.
تحدث المشكلة عندما أحاول ذلك SaveUpdate()
الكائن المحدد.أنا دائما أحصل على الاستثناء
A computed column cannot be the target of an INSERT or UPDATE statement
وهو الصحيح حسب فهمي - وكيف كان من المفترض أن يكون ;)!
أنا أبحث بشكل أساسي عن التكوين والإعداد والسمة المخصصة - أيًا كان - لأقولها
مرحبًا Fluent NHibernate - احصل على الخاصية المحددة
propertyName
ولكن لا تقم بإدراج/تحديث الخاصيةpropertyName
هل هناك شيء من هذا القبيل؟أو هل يوجد حل بديل لهذه الحالة؟لقد بحثت في موقع nhibernate wiki بطلاقة ولكن لم أجد حالة مشابهة.
آمل أن يكون شخص ما قد واجه بالفعل هذه المشكلة وحلها!
إليك مقتطف الشفرة حول كيفية إنشاء الجلسة (ربما يساعد):
public static ISessionFactory GetNHibernateSession()
{
if (nhibernateSession != null)
return nhibernateSession;
if (ConfigurationManager.AppSettings[msSqlConnectionString] == null || ConfigurationManager.AppSettings[msSqlConnectionString] == String.Empty)
throw new NullReferenceException(String.Format("AppSetting '{0}' must not be null!", msSqlConnectionString));
//nhibernateSession = Fluently.Configure().Database(MsSqlConfiguration.MsSql2005.ConnectionString(ConfigurationManager.AppSettings[msSqlConnectionString]))
// .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<T_ABWEICHUNGEN>().IgnoreBase<BaseClass>)).BuildSessionFactory();
nhibernateSession = Fluently.Configure().Database(MsSqlConfiguration.MsSql2005.ConnectionString(ConfigurationManager.AppSettings[msSqlConnectionString]))
.Mappings(m => m.AutoMappings.Add(AutoMap.Assembly(System.Reflection.Assembly.GetExecutingAssembly())
.Override<T_ABWEICHUNGEN>(map =>map.Map(d => d.A08_STATUS_FILE).Length(2147483647))
.IgnoreBase(typeof(BaseClass))
.IgnoreBase(typeof(IDColumn))
.IgnoreBase(typeof(MsSqlQuery))
.IgnoreBase(typeof(MsSqlParamCollection))
.IgnoreBase(typeof(AbweichungStatus))
)).BuildSessionFactory();
return nhibernateSession;
}
}
شكرا حتى الآن على الرد - ساعدني حتى الآن.ولكن - هل هناك طريقة لحل هذه المشكلة بشكل أكثر "ديناميكية"؟
على سبيل المثال:
أريد أن أعلن عن سمة مخصصة تسمى [ReadOnlyDbField]
أعلن الآن عن جميع خصائص الكيان باستخدام هذه السمة المخصصة ليقول:فقط اقرأ هذه القيمة ولا تقم بتحديثها/إدراجها.
في الأساس أريد أن أقول في التكوين
Map all properties with the custom attribute [ReadOnlyDbField] to Not.Insert().Not.Update()
هل هناك طريقة لتنفيذ هذا؟
المحلول
.Override<Entity>(map => map.Map(d => d.STATUS).Not.Insert().Not.Update())
تحديث:حساب للسؤال المحرر
public class ReadonlyDbFielConvention : AttributePropertyConvention<ReadOnlyDbField>
{
protected override void Apply(ReadOnlyDbField attribute, IPropertyInstance instance)
{
instance.Not.Insert();
instance.Not.Update();
}
}