Como você obtém um odatamodelbuilder de API da Web para trabalhar com mapeamentos de API fluentes da EF
Eu criei um modelo de domínio bastante simples usando pocos. Mapeei-os para um contexto EF DB usandoEntityTypeConfiguration<TEnitityType>
aulas. Tudo isso funciona bem.
Agora estou tentando criar um terminal do controlador OData V4 WebAPI usando umODataConventionModelBuilder
e é aí que as coisas estão se desenrolando. Tudo funciona bem até encontrar uma associação que não é baseada em convenções. Mas não consigo encontrar uma maneira de obter oODataBuilder
para pegar os mapeamentos do meuEntityTypeConfiguration<TEnitityType>
aulas.
Isso deixa o meu com 2 opções desagradáveis
Decore meus adoráveis pocos limpos com atributos sujos.Mapeie manualmente novamente todos os mapeamentos não baseados em convenções usando o comandoODataBuilder
Não tenho certeza se os exemplos de código ajudarão, mas aqui estão eles, simplifiquei as entidades por questões de brevidade.
var builder = new ODataConventionModelBuilder();
builder.EntitySet<Item>("Items");
config.MapODataServiceRoute(
routeName: "odata",
routePrefix: "odata",
model: builder.GetEdmModel(),
batchHandler: new DefaultODataBatchHandler((GlobalConfiguration.DefaultServer)));
public class Item
{
public Int32 Id { get; set; }
public Int16 ItemTypeId { get; set; }
public virtual ItemType Type { get; set; }
public virtual ICollection<ItemVersion> Versions { get; set; }
public virtual ICollection<ItemTag> Tags { get; set; }
}
O problema ocorre quando encontra a coleção ItemTags, aqui está uma ItemTag:
public class ItemTag
{
public Int32 ItemId { get; set; }
public string Tag { get; set; }
public Item Item { get; set; }
}
O que você pode ver não é baseado em convenções e eu tenho uma classe de configuração para a seguinte:
public class ItemTagConfiguration : EntityTypeConfiguration<ItemTag>
{
public ItemTagConfiguration()
{
HasKey(x => new {x.ItemId, x.Tag});
HasRequired(x => x.Item)
.WithMany(y => y.Tags)
.HasForeignKey(x => x.ItemId);
}
}
Alguém sabe de uma maneira que eu possa usar essesEntityTypeConfiguration
arquivos com um ODataBuilder ou API da web?
EDITAR
Se achadoesta página o que parece indicar que é possível com o EF 6 que estou usando. O que eu quero fazer é isso
ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
modelBuilder.EntitySet<Dbf>("Dbfs");
// modelBuilder.Configurations.Add(new DbfMap()); <---- NO GOOD - Needs Class from DBContext we only have a model builder :(
Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel();
config.Routes.MapODataRoute("ODataRoute", "odata", model);
mas o construtor não possui uma propriedade Configurações.