我使用pocos创建了一个相当简单的域模型。我已使用EntityTypeConfiguration<TEnitityType>
类将这些映射到EF DB上下文。一切正常。
我现在正在尝试使用ODataConventionModelBuilder
创建一个OData V4 WebAPI控制器端点,这就是事情即将发生的地方。这一切都正常,直到它遇到一个非基于约定的关联。但我找不到让ODataBuilder
从我的EntityTypeConfiguration<TEnitityType>
类中获取映射的方法。
这留下了2个令人不快的选择
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属性。
答案 0 :(得分:0)
两件事:
我现在已阅读多个来源,以防止使用延迟加载和序列化;这基本上就是OData; (它甚至使用system.runtime.serialization.datacontract和datamember属性)
我在从上下文显式加载以及在模型构建器中为dbContext定义导航属性方面取得了更大的成功。我知道您正在查看自定义的导航属性,但我相当确定这些是对ODataModelBuilder类有用的重写方法(不需要太多,并且需要更少的实体框架才能工作)。你刚才提到使用EF的地方,我想这是你将要工作的方向,如果你不需要为你的模型名称添加别名,你可以使用常规命名为每个Set添加一个条目。
EntitySet的( “routePrefixName”)
在构建EdmModel时,它将您之前使用Fluent建立的关系连接起来。如果必须向基础模型添加无关项,则应将每个类定义为EntityType&lt;&gt;(),仅设置密钥。 EdmBuilder可以使用温和属性和键关联来附加到ODataConventionModelBuilder中的EF模型。
我已经摔跤并寻求了一段时间,并且似乎没有关于.Net OData v4浮动的大量信息,可能是由于整个力量datetimeoffset问题。
希望有所帮助