1

1)

我有一个与 WCF 一起使用的实体框架 (v.5) 项目。

我的数据库有一个 Account 表,因此我有一个“Account”实体框架对象。我想公开一个方法:

 AddAccount(Account a)

Account Parameter 是从我的数据库生成的实体框架对象。

每次我尝试使用此服务时,Account 的属性都是空的,我不明白为什么。

这是我的代码示例:

周转基金:

界面:

[OperationContract(Name = "AddAccount")]
string AddAccount(Account Account);

实施:

public string AddAccount(Account newAccount)
{
    myContext db=new myContext();
    db.Accounts.Add(newAccount);
    db.SaveChanges();
    return "something";
}

Account Class 由 EF 生成,具有int“id”字段和DateTime“Created”字段。

我的问题是,为什么“newAccount”参数是空的?

2)

据我所知,公开具有复杂参数的方法的最佳方法是使用DataContractand DataMembers,这引发了我想问的两个问题。

a)我需要实现DataContract一个实体对象吗?据我了解,不建议直接公开 EF 对象,而是DataContract在我想转移的类上使用,但另一方面,我在尝试使用我的项目时没有收到错误,该项目未DataContract在 Account 上实现.

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

谢谢。

4

1 回答 1

1

在您的数据库中,您可以将身份规范分配给 id 字段,并且可以为创建的字段提供默认值。

如果有 id 和 created 的列,则需要初始化 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 对象作为参数传递,这绝对没有问题。您只需要小心不要让您的客户知道您的数据库的架构是什么。

我希望这有帮助。

于 2013-02-10T18:58:15.673 回答