如何使用web API odatamodelbuilder来处理EF流畅的API映射

Ben*_*son 11 entity-framework odata asp.net-web-api

我使用pocos创建了一个相当简单的域模型.我已经使用EntityTypeConfiguration<TEnitityType>类将它们映射到EF DB上下文.一切正常.

我现在正在尝试使用a创建一个OData V4 WebAPI控制器端点ODataConventionModelBuilder,这就是事情即将发生的地方.一切正常,直到它遇到一个非常规的关联.但我无法找到一种方法来ODataBuilder从我的EntityTypeConfiguration<TEnitityType>课程中获取映射.

这留下了2个令人不快的选择

  • 用脏的属性装饰我可爱干净的pocos.
  • 使用.手动重新映射所有非基于约定的映射 ODataBuilder

不确定代码示例是否会有所帮助,但无论如何,我已经简化了实体以简化.

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; }     
    }
Run Code Online (Sandbox Code Playgroud)

遇到ItemTags集合时出现问题,这里是ItemTag:

public class ItemTag
    {
        public Int32 ItemId { get; set; }

        public string Tag { get; set; }

        public Item Item { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

您可以看到的不是基于约定的,我有一个配置类,如下所示:

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);

        }
    }
Run Code Online (Sandbox Code Playgroud)

有没有人知道我可以使用EntityTypeConfigurationODataBuilder或Web API 使用这些文件的方法?

编辑

如果发现这个页面似乎表明它可能与我正在使用的EF 6.我想做的就是这个

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);
Run Code Online (Sandbox Code Playgroud)

但构建器没有Configurations属性.

Nat*_*gue 1

两件事情:

  1. 我现在已经阅读了多个资料,反对使用延迟加载和序列化;这基本上就是 OData;(它甚至使用 system.runtime.serialization.datacontract 和 datamember 属性)

  2. 我在显式从上下文加载以及在 dbContext 的模型构建器中定义导航属性方面取得了更多成功。我知道您正在查看自定义导航属性,但我相当确定这些是对 ODataModelBuilder 类有用的重写方法(不需要太多假设,并且需要较少的实体框架才能工作)。在您已经提到使用 EF 的地方,我想这就是您将工作的方向,如果您不需要为模型名称添加别名,则可以使用约定命名为每个 Set 添加一个条目。

    实体集(“路由前缀名称”)

在构建 EdmModel 时,它会连接您之前使用 Fluent 建立的关系。如果您确实必须向底层模型添加无关项,则应将每个类定义为 EntityType<>(),仅设置键。EdmBuilder 可以使用温和的属性和键关联来附加到 ODataConventionModelBuilder 中的 EF 模型。

我已经苦苦寻找了一段时间,似乎没有大量关于 .Net OData v4 的信息,可能是由于整个强制 datetimeoffset 问题。

希望能有所帮助