如何保存EntityObject

时间:2011-05-23 09:32:29

标签: entity-framework-4

假设我有很多实体课程。 我有一个数据库上下文。

我有一个代码

Person p=new Person();
p.Name="test";

请注意,没有带上下文的行。

如果上下文只知道它是EntityObject

,我如何使用上下文保存此对象?

更新:

if (obj.EntityState == System.Data.EntityState.Detached)
                context.AddObject(obj.EntityKey.EntitySetName, obj);

但obj.EntityKey为null,因此无法正常工作

UPDATE2:

我有一个代码:

public static void EntitySave(EntityObject obj)
        {
            if (obj == null)
                throw new ArgumentNullException(obj.GetType().Name, obj.GetType().Name + " не должен быть пустым");
            var context = GetSqlConnection();

            if (obj.EntityState == System.Data.EntityState.Detached)
                context.AddObject(obj.EntityKey.EntitySetName, obj);//there is an exception

            context.SaveChanges();
        }

和另一个:

 public static void SaveNewPerson()
        {
            Person p = new Person();
            EntitySave(p);//there is an exception
        }

那么EntitySave应该如何正确保存对象?或者我可能需要辅助函数来创建每个实体类?

2 个答案:

答案 0 :(得分:2)

您无法单独传递EntityObject,因为新创建的EntityObject没有实体集的信息。您可以创建辅助函数或辅助字典,例如

private static Dictionary<Type, string> _entitySets = new Dictionary<Type, string>
{
    { typeof(Person), "Persons"},         
    { typeof(Address), "Addresses"}
}

...

public static void EntitySave(EntityObject obj)
{
    if (obj == null)
        throw new ArgumentNullException("не должен быть пустым");

    var context = GetSqlConnection();
    if (obj.EntityState == System.Data.EntityState.Detached)
        context.AddObject(EntitySets[obj.GetType()], obj);

    context.SaveChanges();
}

只需检查设置名称是“Persons”还是“PersonsSet”

答案 1 :(得分:1)

“上下文不知道对象的类型”仍然不清楚你的意思。上下文必须知道对象的类型,否则它不知道如何映射和持久化对象。 EDMX中描述了对象的类型。

如果您只想将对象添加到上下文中,则必须使用:

// You must say the name of EntitySet where you want to add the object
context.AddObject("PersonsSet", person);

或:

// You must call the AddObject method on correct object set
context.CreateObjectSet<Person>().AddObject(person);

默认代码生成还提供了类似AddPerson之类的特定方法。