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

标签 c# entity-framework

我正在使用 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/

相关文章:

.net - 将 Npgsql 用于 EntityFramework 的 Postgis 地理类型

.net - 不要回滚 Entity Framework 中的错误事务

c# - Nhunspell 无法向词典中添加新词

c# - 如何在更新查询中将格式为 test@test1.com 的电子邮件地址传递给 Access DB

c# - 停止方法并等待用户输入

c# - 我是否需要使用 using 关键字关闭 SQL Server 连接?

c# - Entity Framework 无法将 NULL 值插入列“身份规范”设置为“否”

c# - 仅当目标属性不为 null 时才使用 DestinationValue

linq - Entity Framework 中多对多关系的计数

c# - 是否可以在 Entity Framework 中的两个普通字段之间创建关联,从而忽略主键?