【发布时间】:2014-08-24 19:15:14
【问题描述】:
我使用 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);
}
}
有人知道我可以通过 ODataBuilder 或 Web API 使用这些 EntityTypeConfiguration 文件吗?
编辑
如果找到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);
但构建器没有配置属性。
【问题讨论】:
-
Fanstatic!,做了更多的谷歌搜索,“odata web api fluent data mapping”的排名最高的搜索结果现在是这个SO问题。
-
你有没有想过这个问题?我正在为同样的事情哭泣。
标签: entity-framework odata asp.net-web-api