首页 文章

实体框架和WCF数据成员

提问于
浏览
1

1)

我有一个与WCF一起使用的Entity Framework(v.5)项目 .

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

AddAccount(Account a)

Account Parameter是从我的DataBase生成的实体框架对象 .

每次我尝试使用此服务时,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 "Created"字段 .

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

2)

据我所知,暴露具有复杂参数的方法的最佳方法是使用 DataContractDataMembers ,这引发了两个我想问的问题 .

a)我是否需要将 DataContract 实现为Entity对象?根据我的理解,它不建议直接公开EF对象,但在类I上使用 DataContract ,在Account上实现 DataContract .

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

谢谢 .

1 回答

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

    我希望这有帮助 .

相关问题