使用POCO和objectcontext从EFcontextprovider中定制元数据

本文关键字:元数据 EFcontextprovider POCO objectcontext 使用 | 更新日期: 2023-09-27 18:08:41

我是breezejs的新手,并试图开发一个有角微风的SPA。
我有一个名为POCOObjectContext的类,它继承自基类ObjectContext。我的数据库有一个名为Customer的表,还有一个名为Customer的POCO。但是我在POCO Customer上有一些额外的属性,如Email, SupplierName,它们不是表列。当我从EFContextProvider获取Metadat()时,它只向我提供了名为Customer的表中的列。但是保存名为Customer的POCO的上下文具有我声明的所有属性。因此在BreezeJS中,当创建对象从微风。EntityManager,它是根据客户表中的列创建的,但我需要这些额外的属性在元数据中获取和保存数据从/到我的数据库。如有任何帮助,我将不胜感激。

This is Context Class POCOObjectContext (tmpDataBaseEntities is ConnectionString)

    public class POCOObjectContext : ObjectContext
    {
      private ObjectSet<Customer> customers;
      public POCOObjectContext()
          : base("name=tmpDataBaseEntities", "tmpDataBaseEntities")
      {
          customers = CreateObjectSet<Customer>();              
      }
      public ObjectSet<Customer> Customers
      {
        get { return customers; }
      }
   }

这是持有额外属性SupplierName和Email的POCO Customer

    public class Customer
    {
      [Key]
      public int Id { get; set; }
      public string FirstName { get; set; }
      public string LastName { get; set; }
      public string SupplierID { get; set; }
      //Extra Properties not in the Customer Table as Columns
      public string SupplierName { get; set; }
      public string Email { get; set; }
    }

最后的微风控制器

    [BreezeController]
    public class ReceiveServiceController : ApiController
    {
        EFContextProvider<POCOObjectContext> _pocoContext = new EFContextProvider<POCOObjectContext>();
        ReceiveDal _rcvDal = new ReceiveDal();
        [HttpGet]
        public string Metadata()
        {
           var t = _pocoContext.Metadata();
           return t; // It holds the properties info that match with POCO and Database Table.
        }
    }

使用POCO和objectcontext从EFcontextprovider中定制元数据

您已经发现,发送给客户机的元数据定义中不包括服务器上的自定义未映射属性。但是,您可以这样扩展客户端的Customer定义,

//Assuming you have camelCase naming convention enabled
function Customer() {
    this.supplierName = '';
    this.email = '';
}
entityManager.metadataStore.registerEntityTypeCtor('Customer', Customer);

现在,当您调用saveChanges时,Breeze将在有效负载中包含上述自定义属性。

{"Id": 42, "Name": "Customer Name","__unmapped":{"supplierName":"Supplier Name", "email": "supplier@supplier.com"},...}

然后,在服务器上,您可以检查和解析JObject负载以检索未映射的属性。

您可以在http://www.breezejs.com/documentation/extending-entities

阅读更多关于在客户端扩展Breeze实体的信息