使用POCO和ObjectCotext从EFcontextprovider自定义元数据

时间:2014-06-16 08:43:16

标签: c# breeze asp.net-web-api

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

这是Context Class POCOObjectContext(tmpDataBaseEntities是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; }
      }
   }

这是POCO客户,它拥有额外的属性SupplierName和Email

    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.
        }
    }

1 个答案:

答案 0 :(得分:1)

如您所发现,服务器上的自定义未映射属性不包含在发送到客户端的元数据定义中。但是,您可以通过执行类似的操作来扩展客户的客户定义

//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实体的更多信息

希望这有帮助。