How to treat your content model as code using .NET and Contentful

Published on November 14, 2017

Content-Like-Code BlogPost

Subscribe for updates

Build better digital experiences with Contentful updates direct to your inbox.

Today we're pleased to show you a code first alternative for .NET developers. This release makes it easier for you to keep your content infrastructure within your code base.

We call this initiative Contentful.Codefirst and you can install it using NuGet: nuget install-package Contentful.CodeFirst.

This release solves the challenge that you sometimes face when using a headless CMS and need to unify your content model across environments. Because sometimes changes that that you made in the staging environment might be overlooked when you ship your code to production.

Note: This project is independent from the Contentful Migration CLI which proposes a solution for scripting content model changes.

Getting started

To get started you create a class that will represent your content type in Contentful and decorate it with a ContentType attribute.

Then call the CreateContentTypesFromAssembly method with a configuration object containing your space id and API key.

The “AssemblyName” argument is the name of the assembly where the BlogPost class exists.

Preferably, you will make this call at application launch — and the content types will be automatically created for you. In the case outlined above, the result looks like this.

code-first-blog-post (1)

You might have noticed that the created content type does not have any description, that you did not get to set the displayfield and the created property is of type long text. Fortunately, you can control all of these settings from your code.

As you can see, there's an attribute to use for fields if you need to control their properties as well. You can also specify the id and the name of the content type if you're dissatisfied with the defaults.

Finally, you can also set the order property which controls the order in which content types are processed. This can be important for content types that reference other content types as the referenced content type then needs to be created before the one referencing it.

The ContentField attribute similarly contains several properties you can use to control what type of field gets created in Contentful.

You can set the id of the field as with a content type. You can decide whether the field should be localized or not, omitted from the API response and/or required. You can also set a custom name for the field.

Another important concept in Contentful is field appearances, which allows you to specify how a certain field should appear and behave in the Contentful web app. You can for example specify that a long string should appear as either a markdown editor, a plain input field or a multiline textbox. In Contentful.Codefirst you do this by adding another attribute to your property.

The FieldAppearance attribute has two properties, the extension id and the helptext. The extension id should be set to one of the system extensions or one of your custom ones. You can read more about this concept and find a complete list of extensions available here. The helptext is displayed below the field to give the editor a hint on how to use it.

There are also specific attributes for a few field appearances as they have custom configuration. RatingAppearance, BooleanAppearance and DatePickerAppearance. Here's an example of the BooleanAppearance.

In this way, you can control the settings and appearances of fields — but how about validations?

Validations can be added by using the validation attributes Size, Range, LinkContentType, InValues, MimeType, Regex, Unique, DateRange, FileSize and ImageSize. You apply them to a property and the validation gets added to Contentful.

To create multiple content types which reference each other you create multiple classes and take care adding the order property to make sure they are created in the correct order. Here we’ve added Author to our blog post.

And you, of course, need to create the actual Author class.

This will create a reference field by the name of Author, but it will currently accept any type of entry. To restrict it to only accept Author content types we use a validation attribute.

Adding assets is equally straightforward.

Making sure only a certain type of asset can be added is, again, done with a validation attribute.

Advanced techniques and gotchas

It's important to understand that Contentful.Codefirst, while powerful, is nothing magical. All it does, under the hood, is call the Contentful API. This means that any requirement of the API is also a requirement of Contentful.Codefirst.

Deleting fields is one example that can seem slightly counter intuitive at first. If you remove a property of a class that has already been created as a content type in Contentful, an exception is thrown.

When you remove the property of a class, Contentful.Codefirst will try to remove that field from the content type in Contentful. You are not allowed to remove a field that has not first been omitted from the API response. This is very important to avoid unintentional data loss. Once a field is deleted so is all data related to that field. Therefore you must first omit a field before deleting it.

Once a field has been omitted, you can safely delete it from your content type. Do remember that all data associated with the field will be deleted as well!

The display field of a content type can never be deleted, unless you specify another field as the display field.

Circular references is another tricky concept. If you have two content types that need to reference each other, you need to first create one of them without the content type restriction set, then update it once both have been created. Consider the following example.

You create both content types, but only the property of the BlogPost has a LinkContentType validation. Once you've run this code, and both content types have been created, you can add the validation to the Author class as well.

Where to go from here?

This was a quick introduction to how you can treat your content model as code in .NET. You can also check out the code on github if you want to contribute to the project or simply browse through the source.

We also invite you to discuss this release, and everything else related to Contentful, over at Contentful Community

Happy coding!

Subscribe for updates

Build better digital experiences with Contentful updates direct to your inbox.

Robert Linde

Robert Linde

.NET developer, Contentful

Robert is a .NET developer in the Ecosystem team at Contentful. He's has been building .NET solutions since the early 2000s, he is a passionate open source advocate and an avid chess fan. You can find him online at [https://robertlinde.se/](https://robertlinde.se/) or on Twitter ([@svalgrodnad](https://twitter.com/svalgrodnad)).

Related articles

GraphQL introspection queries let you examine the structure of a GraphQL API to discover what schemas, types, and features it offers. Here's how to use them.
Guides

GraphQL introspection queries: How to query and explore GraphQL APIs

November 7, 2024

When you need fast-loading, high-performing web pages, a static website will be high on your priority list. Let's look at static websites and how they work.
Guides

What's a static website?

February 21, 2023

What is a framework? Software frameworks make programming and testing a project easier. Here's what you need to know about them and a list to choose from. 
Guides

What is a framework in programming? All about software frameworks

August 16, 2022

Contentful Logo 2.5 Dark

Ready to start building?

Put everything you learned into action. Create and publish your content with Contentful — no credit card required.

Get started