使用我自己的属性与Subsonic SimpleRepository

时间:2011-07-19 23:14:43

标签: .net subsonic

我一直在寻找最近的ORM,而SubSonic的SimpleRepository似乎是我正在寻找的解决方案。

有没有办法使用我自己的属性或来自System.ComponentModel的属性来驱动一些SQL的生成?我想保持我的模型/域对象清除第三方的东西。

1 个答案:

答案 0 :(得分:2)

我不建议这样做,但可以这样做。

创建与SubSonics属性匹配的属性(例如OrmIgnore而不是SubSonicIgnore),仍需要实施SubSonic.SqlGeneration.Schema.IClassMappingAttributeSubSonic.SqlGeneration.Schema.IPropertyMappingAttributeSubSonic.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;
    }