假设我有很多实体课程。 我有一个数据库上下文。
我有一个代码
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
应该如何正确保存对象?或者我可能需要辅助函数来创建每个实体类?
答案 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
之类的特定方法。