实体框架和WCF数据成员

时间:2013-02-10 15:10:17

标签: c# wcf entity-framework

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)

据我所知,公开具有复杂参数的方法的最佳方法是使用DataContractDataMembers,这就提出了两个我想问的问题。

a)我是否需要将DataContract实现到Entity对象?从我的理解,它不建议直接暴露EF对象,但在我想转移的类上使用DataContract,但另一方面,我在尝试使用我的项目时没有错误,在帐户上实施DataContract

b)为什么不建议将EF对象作为参数传递,除了让客户端理解我的数据库表的构建?

感谢。

1 个答案:

答案 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对象作为参数传递到业务逻辑中,这绝对没有问题。您只需要小心不要让客户知道数据库的架构是什么。

我希望这会有所帮助。