【问题标题】:unable to locate property: Nome on entityType:无法找到属性:实体类型上的名称:
【发布时间】:2013-07-05 23:03:29
【问题描述】:

问题

无法找到属性:entityType 上的 Nome:Modalidade:#CreditoImobiliarioBB.Model

但是这个属性在类中! 不会生成对/odata/modalidades 的请求,只会生成对/odata/$metadata 的请求。

代码

域类

public class Modalidade : INamedEntity
{
    public int Id { get; set; }

    [StringLength(80), Required]
    public string Nome { get; set; }
}

配置

public static class WebApiConfig 
{
    public static void Register(HttpConfiguration config)
    {
        var modelBuilder = new ODataConventionModelBuilder(config);
        modelBuilder.EntitySet<Modalidade>("modalidades");
        modelBuilder.Namespace = "CreditoImobiliarioBB.Model";
        config.Routes.MapODataRoute(routeName: "odata", routePrefix: "odata", model: modelBuilder.GetEdmModel());

        var jsonFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
        var enumConverter = new StringEnumConverter();
        jsonFormatter.SerializerSettings.Converters.Add(enumConverter);
        var jqueryFormatter = config.Formatters.FirstOrDefault(x => x.GetType() == typeof(JQueryMvcFormUrlEncodedFormatter));
        config.Formatters.Remove(config.Formatters.XmlFormatter);
        config.Formatters.Remove(config.Formatters.FormUrlEncodedFormatter);
        config.Formatters.Remove(jqueryFormatter);

        config.Formatters.JsonFormatter.SerializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
    }
}

public static class BreezeWebApiConfig
{
    public static void RegisterBreezePreStart()
    {
        GlobalConfiguration.Configuration.Routes.MapHttpRoute(
            name: "BreezeApi"
            , routeTemplate: "api/{controller}/{action}"
            , defaults: new { action = "Get" }
        );
    }
}

咖啡脚本

微风的默认值

breeze.NamingConvention.camelCase.setAsDefault()
breeze.config.initializeAdapterInstances
    dataService: "OData"

查询

query = new breeze.EntityQuery().from("modalidades")
query = query.where("Nome", breeze.FilterQueryOp.Contains, @TermoBusca()) if @TermoBusca()
query.orderBy("Nome")

manager = new breeze.EntityManager("/odata/")           
promise = manager.executeQuery(query)
    .finally ->
        notice.pnotify_remove()
        filterUrl = creditoimobiliario.getParameterByName "\\$filter", @url
        _this.TermoBusca "$filter=#{filterUrl}" if filterUrl
    .fail creditoimobiliario.displayXhrNotifyError
promise.then (data, status, xhr) =>
    return if not status or status != 200
    ko.utils.arrayPushAll @Collection, data.value
    @NextUrl data["odata.nextLink"]
promise

元数据

<EntityType Name="Modalidade">
    <Key>
        <PropertyRef Name="Id" />
    </Key>
    <Property Name="Id" Type="Edm.Int32" Nullable="false" />
    <Property Name="Nome" Type="Edm.String" Nullable="false" />
</EntityType>

【问题讨论】:

    标签: asp.net-web-api odata breeze


    【解决方案1】:

    不确定确切的问题,但 Microsoft ODataConventionModelBuilder 的当前状态是它尚不支持完整的 OData 规范。特别是它还不支持外键的定义(Breeze 需要)。它也可能存在其他问题。微软声称这将在以后的版本中修复。

    现在我将简单地使用 Microsoft 的 WCF 数据服务将 EF 模型公开给 OData。比如:

    public class ODataService : DataService<MyEFContext> {
    
        // This method is called only once to initialize service-wide policies.
        public static void InitializeService(DataServiceConfiguration config) {
          // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
          // Examples:
          // config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.All);
          ...
    
           config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
           config.UseVerboseErrors = true;
    }
    

    【讨论】:

    • 我使用的是夜间构建,它支持 FK。
    【解决方案2】:

    我在this link 中找到了答案。

    解决方案是简单地注释这行代码NamingConvention.camelCase.setAsDefault();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-08
      • 2021-02-16
      • 2011-09-15
      • 2020-06-01
      • 2013-02-10
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多