gpt4 book ai didi

c# - 如何编写实体实例方法以在 Entity Framework 4.0 中持久化自身?

转载 作者:太空宇宙 更新时间:2023-11-03 14:31:08 25 4
gpt4 key购买 nike

我正在使用 Entity Framework 4.0 中的小型模型。我想要一个表示实体的对象的实例方法将实体持久保存到数据库中。因此,而不是来自“外部”代码:

public static void Main(string[] args)
{
using (EFContext ctx = new EFContext())
{
context.AnEntitySet.AddObject(refToTheEntityInstance);
context.SaveChanges();

相反,我希望实体的实例能够自行持久化,其中 Contact 是实体名称。

public ContactInstance : Contact
{
public void Persist(List<AnotherEntity> otherEntityList)
{
using (EFContext ctx = new EFContext())
{
...
ctx.Contacts.AddObject(this); // DOESN'T WORK.
...
...wire up navigation property to collection of AnotherEntity...
ctx.SaveChanges();

我做错了什么。这是一个糟糕的设计吗?在我看来,一个实体,就像面向对象设计中的任何对象一样,应该“知道”如何坚持自己。

最佳答案

从模式的角度来看,您正在尝试引入 ActiveRecord模式,有些人喜欢,有些人讨厌。所以问这是否是糟糕的设计可能会很快变成宗教 :)

话虽如此,但不幸的是,EF 本身并不支持它。

你的代码有很多问题:

1) ContactInstance 不能被视为联系人,这似乎是您在 EF 中尝试做的事情,如果您在 CLR 中有派生类型(即 ContactInstance),它必须对应于实体模型也是。 (即称为 ContactInstance 的实体类型)我怀疑你没有。我猜你有这个只是为了添加 Persist 方法。另一种方法是在分部类中(EF 可以很好地处理分部类:

public partial class Contact
{
public void Persist(...){}
}

2) 接下来,您的代码存在一些问题,实体可能会附加到多个 ObjectContext,例如,如果您编写以下代码:

Contact c = new Contact();
c.Firstname = ...;
c.Surname = ...;
c.Persist();
c.Surname = ...;
c.Persist();

它将失败 - 在第二次调用 Persist() 时 - 因为实体一次只能附加到一个上下文:

  • 第一个 Persist()。将实体添加到一个上下文中。
  • 第二个 Persist() 将尝试将相同的实体添加到另一个上下文中。异常(exception)时间!

这个问题的解决方法是以某种方式拥有一个环境上下文,使用诸如 ThreadBound statics 之类的东西,但是你必须处理各种棘手的问题。

无论如何,这个故事的寓意是,您尝试使用 EF 是可能的,但这并不容易,您必须认真考虑 ObjectContext 生命周期、附加/分离等问题。

希望对你有帮助

Alex James

前 EF 团队成员

关于c# - 如何编写实体实例方法以在 Entity Framework 4.0 中持久化自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2554883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com