实体框架(4)外键关系问题

时间:2011-03-24 21:38:11

标签: c# entity-framework entity-framework-4

让我说我有:

用户名实体,其中包含Int64作为ID和其他一些字段。

使用Int64作为ID的消息实体以及通过1个用户名链接到用户名实体的一些其他字段可以具有0到多个消息关系。

我有两个用户名和消息实体的存储库(基本的所有,添加,删除,保存方法)。

但是我想将我在代码中生成的消息实体(新的Message()等)与用户名相关联,如何使用存储库和两个不同的objectcontext进行此操作?

我通过以下方式使用存储库来实现它:

usernameEntity.Messages.Add(msg);

任何人都有任何提示,相当困惑,好像我可以将这种类型的逻辑分成两个不同的存储库。

4 个答案:

答案 0 :(得分:2)

您只需致电:

var user = repository.GetUserById(id);
user.Messages.Add(new Message(...));
Save(); // I don't know how do you save changes.

您的存储库应该共享一个工作单元(业务事务)的单个上下文。您应该有一些方法(保存,提交或其他任何方法),这些方法将保存对从所有存储库加载的实体所做的更改。这通常由实现工作单元模式的单独类来处理,该工作模式包装上下文并在存储库之间共享。保存更改将在工作单元而不是存储库上调用。这个问题有很多相关的问题。

如果在EFv4中建模了真正的外键关系,您也可以使用:

var message = new Message(...);
message.UserId = id; // Foreign key property exposed on Message entity
repository.Insert(message);
Save();

答案 1 :(得分:1)

您需要一个跨多个存储库的工作单元 - 并负责提交对数据库的更改。

答案 2 :(得分:1)

我在相同实体上下文之上使用存储库模式,因此您可以轻松地在存储库之间共享对象。

答案 3 :(得分:0)

如果它是一对多的关系,那么您的消息实体应该有一个用户名id。您可以使用用户名id在消息实体存储库ObjectContext中查找用户对象,并将消息添加到用户,然后保存更改。