CF9 ORM使用对象填充实体

时间:2011-05-25 16:27:26

标签: orm coldfusion

我正在使用Model-Glue / Coldspring进行新的应用程序,我想我会把CF9 ORM投入到混合中。

我现在唯一的问题是使用对象填充实体。或多或少以下代码验证只能存在一个用户名。还有一些其他逻辑没有显示出来。

我的第一个想法是使用这样的东西:

var entity = entityload('UserAccount' ,{UserName=arguments.UserAccount.getUserName()},"true")

entity = arguments.UserAccount;

然而,这不符合我的预期。甚至可以使用对象填充实体,还是需要使用setter?

2 个答案:

答案 0 :(得分:4)

不确定这是否是您要找的。如果你有......

component persistent="true" entityName="Foo" 
{
  property a;
  property b;
}

你可以在第二个参数中传递一个结构来初始化实体(我相信在CF9.0.1中添加)

EntityNew("Foo", {a="1",b="2"});

要用另一个对象填充Foo,您可以使用Memento模式,并为您的对象实现一个GetMemento()函数,该函数返回其所有属性的结构。

EntityNew("Foo", bar.getMemento());

但是,CF不会打电话给您的自定义设置器!如果要使用setter设置它们,可以在init()构造函数中添加对setter的调用,或者使用您选择的MVC框架来填充bean。在Model-Glue中,它是makeEventBean()

更新:或者......这是黑客......

EntityNew("Foo", DeserializeJSON(SerializeJSON(valueObject)));

使用此风险需要您自担风险。 JSON可能对你的数字以及'yes','no','true','false'字符串做了奇怪的事情。 :)

答案 1 :(得分:0)

  

甚至可以使用对象填充实体,还是需要使用setter?

如果您的意思是“是否有可能创建从已存在且已设置属性的持久性CFC的实例加载ORM实体”,那么您可以使用EntityLoadByExample( object,[unique] )

entity = EntityLoadByExample( arguments.userAccount,true );

这假设userAccount CFC已被定义为持久性,并且在传入之前已设置其用户名值(在您的情况下似乎就是这种情况)。

请记住,如果在您传递的对象中设置了任何其他属性,包括空字符串,它们将用作加载实体的过滤器,因此如果它们与数据库中的记录不完全匹配,则不执行任何操作将被加载。