gpt4 book ai didi

entity-framework - 如何让 Web API odatamodelbuilder 使用 EF fluent API 映射

转载 作者:行者123 更新时间:2023-12-04 02:29:32 28 4
gpt4 key购买 nike

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

我现在正在尝试使用 ODataConventionModelBuilder 创建 OData V4 WebAPI Controller 端点这就是事情变得不顺利的地方。一切正常,直到遇到不基于约定的关联。但我找不到获得 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 属性。

    最佳答案

    两件事情:

  • 我已经阅读了多个来源,反对使用延迟加载和序列化;这基本上就是 OData; (它甚至使用 system.runtime.serialization.datacontract 和 datamember 属性)
  • 我在从上下文显式加载和在 dbContext 的模型构建器中定义导航属性方面取得了更大的成功。我知道您正在查看自定义导航属性,但我很确定这些是对 ODataModelBuilder 类有用的覆盖方法(假设不太多,需要更少的 Entity Framework 才能工作)。在您提到使用 EF 的地方,我想这就是您的工作方向,如果您不需要为模型名称设置别名,则可以使用约定命名为每个 Set 添加一个条目。

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

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

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

    希望有所帮助

    关于entity-framework - 如何让 Web API odatamodelbuilder 使用 EF fluent API 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24557511/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com