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

时间:2014-07-03 15:15:55

标签: entity-framework odata asp.net-web-api

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

我现在正在尝试使用ODataConventionModelBuilder创建一个OData V4 WebAPI控制器端点,这就是事情即将发生的地方。这一切都正常,直到它遇到一个非基于约定的关联。但我找不到让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; }     
    }

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

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

        public string Tag { get; set; }

        public Item Item { get; set; }
    }

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

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

        }
    }

有没有人知道我可以将这些EntityTypeConfiguration文件与ODataBuilder或Web API一起使用?

修改

如果找到this page,这似乎表明我可能使用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);

但构建器没有Configurations属性。

1 个答案:

答案 0 :(得分:0)

两件事:

  1. 我现在已阅读多个来源,以防止使用延迟加载和序列化;这基本上就是OData; (它甚至使用system.runtime.serialization.datacontract和datamember属性)

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

    EntitySet的( “routePrefixName”)

  3. 在构建EdmModel时,它将您之前使用Fluent建立的关系连接起来。如果必须向基础模型添加无关项,则应将每个类定义为EntityType&lt;&gt;(),仅设置密钥。 EdmBuilder可以使用温和属性和键关联来附加到ODataConventionModelBuilder中的EF模型。

    我已经摔跤并寻求了一段时间,并且似乎没有关于.Net OData v4浮动的大量信息,可能是由于整个力量datetimeoffset问题。

    希望有所帮助