Skip to content

MaxLengthAttributeEdmPropertyConvention to allow inheritance from MaxLengthAttribute #44

@sherlock1982

Description

@sherlock1982

MaxLengthAttributeEdmPropertyConvention takes into account MaxLength attribute and sets MaxLength property where appropriate.
I have a number of pattern-attributes like this (only an example):

class ShortLengthStringAttribute : MaxLengthAttribute
{
    public ShortLengthString() : base(50)
    {
        this.ErrorMessage = "Max length is 50 characters";
    }
};
class LongLengthStringAttribute : MaxLengthAttribute
{
    public LongLengthString() : base(255)
    {
        this.ErrorMessage = "Max length is 255 characters";
    }
};

In this case MaxLengthAttributeEdmPropertyConvention ignores my attributes. Is it possible to allow descendants of MaxLengthAttribute here?

    public MaxLengthAttributeEdmPropertyConvention()
        : base(attribute => attribute.GetType() == typeof(MaxLengthAttribute), allowMultiple: false)
    {
    }

Assemblies affected

Microsoft.OData.ModelBuilder.dll 2.0.0

Reproduce steps

Make a model with

 [ShortLengthString] string ShortString { get; set; }

Expected result

MaxLength should be automatically set to 50 in the model.

Actual result

It is not set

Additional detail

I know there are workarounds. For example I can do it manually. Or I can do something like this:

        builder.OnModelCreating = (builder) =>
        {
            foreach (var structType in builder.StructuralTypes)
            {
                foreach (var property in structType.Properties.OfType<LengthPropertyConfiguration>())
                {
                    var pp = property.PropertyInfo.GetCustomAttribute<MaxLengthAttribute>();
                    if (pp != null)
                    {
                        property.MaxLength = pp.Length;
                    }
                }
            }
        };

But I don't think it is natural.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions