1)
我有一个与WCF一起使用的Entity Framework(v.5)项目。
我的数据库有一个Account表,因此我有一个“Account”实体框架对象。 我想公开一种方法:
AddAccount(Account a)
帐户参数是从我的数据库生成的实体框架对象。
每次尝试使用此服务时,Account的属性都是空的,我无法理解原因。
以下是我的代码示例:
WCF:
接口:
[OperationContract(Name = "AddAccount")]
string AddAccount(Account Account);
实施:
public string AddAccount(Account newAccount)
{
myContext db=new myContext();
db.Accounts.Add(newAccount);
db.SaveChanges();
return "something";
}
帐户类由EF生成,并且有int
“id”字段和DateTime
“已创建”字段。
我的问题是,为什么“newAccount”参数为空?
2)
据我所知,公开具有复杂参数的方法的最佳方法是使用DataContract
和DataMembers
,这就提出了两个我想问的问题。
a)我是否需要将DataContract
实现到Entity对象?从我的理解,它不建议直接暴露EF对象,但在我想转移的类上使用DataContract
,但另一方面,我在尝试使用我的项目时没有错误,在帐户上实施DataContract
。
b)为什么不建议将EF对象作为参数传递,除了让客户端理解我的数据库表的构建?
感谢。
答案 0 :(得分:1)
在您的数据库中,您可以将身份规范分配给ID字段,并且可以为创建的字段指定默认值。
如果您有id列并已创建,则需要初始化Created。除非数据库中没有标识规范,否则无需初始化id字段。通常,您需要初始化值,因为您的数据库无法猜测应该为您的属性分配哪些值。
因此,您的实体不是由数据库创建的,它是由您的方法创建的,它是空的,因为您没有初始化它。示例初始化
public string AddAccount()
{
myContext db=new myContext();
//id is not initialized, because I'm assuming it has an identity specification
db.Accounts.Add(new Account() { Created = DateTime.Now.ToUniversalTime()});
db.SaveChanges();
return "something";
}
你的实体类不需要实现DataContract,我的项目无可挑剔地使用EF对象,这些对象是没有实现DataContract的类的实例。
您可以将EF对象作为参数传递到业务逻辑中,这绝对没有问题。您只需要小心不要让客户知道数据库的架构是什么。
我希望这会有所帮助。