Как сохранить EntityObject - PullRequest
0 голосов
/ 23 мая 2011

Допустим, у меня много классов сущностей.У меня есть контекст БД.

У меня есть код

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

Обратите внимание, что нет строк с контекстом.

Как сохранить этот объект, используя контекст,если контекст знает только, что это EntityObject?

ОБНОВЛЕНИЕ:

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

но obj.EntityKey имеет значение null, поэтому он не работает

ОБНОВЛЕНИЕ2:

У меня есть код:

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 ]

2 голосов
/ 30 мая 2011

Вы не можете сделать это, передавая 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();
}

Просто проверьте, является ли установленное имя «Персоны» или «Персона»

1 голос
/ 23 мая 2011

Пока не ясно, что вы подразумеваете под «контекст не знает тип объекта» . Контекст должен знать тип объекта, иначе он не знает, как отобразить и сохранить объект. Тип объекта описан в 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 или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...