我一直在寻找最近的ORM,而SubSonic的SimpleRepository似乎是我正在寻找的解决方案。
有没有办法使用我自己的属性或来自System.ComponentModel
的属性来驱动一些SQL的生成?我想保持我的模型/域对象清除第三方的东西。
答案 0 :(得分:2)
我不建议这样做,但可以这样做。
创建与SubSonics属性匹配的属性(例如OrmIgnore
而不是SubSonicIgnore
),仍需要实施SubSonic.SqlGeneration.Schema.IClassMappingAttribute
或SubSonic.SqlGeneration.Schema.IPropertyMappingAttribute
或SubSonic.SqlGeneration.Schema.IRelationMappingAttribute
从SubSonic.Core \ Extensions \ Object.cs查看此代码,了解正在发生的事情
public static ITable ToSchemaTable(this Type type, IDataProvider provider)
{
...
var typeAttributes = type.GetCustomAttributes(typeof(IClassMappingAttribute), false);
foreach (IClassMappingAttribute attr in typeAttributes)
{
if (attr.Accept(result))
{
attr.Apply(result);
}
}
...
// Now work with attributes
foreach (IPropertyMappingAttribute attr in attributes.Where(x => x is IPropertyMappingAttribute))
{
if (attr.Accept(column))
{
attr.Apply(column);
}
}
....
}
您的Apply实现应修改架构以执行您想要的操作。 像这个(来自SubSonicDefaultSettingAttribute):
public void Apply(IColumn column)
{
column.DefaultSetting = DefaultSetting;
}
您应该查看SubSonic来源并将每个自定义属性标记为过时
[Obsolete("Use OrmIgnore instead", true)]
[AttributeUsage(AttributeTargets.Property)]
public class SubSonicIgnoreAttribute : Attribute { }
您需要修复的属性(不使用界面)有一些直接引用。
你必须寻找字符串引用
private static bool ColumnIsIgnored(object[] attributes)
{
foreach (var att in attributes)
{
if (att.ToString().Equals("SubSonic.SqlGeneration.Schema.SubSonicIgnoreAttribute"))
{
return true;
}
}
return false;
}
与
private static bool ColumnIsIgnored(object[] attributes)
{
foreach (var att in attributes)
{
if (att.ToString().EndsWith("OrmIgnoreAttribute"))
{
return true;
}
}
return false;
}