Как обновить сущность из новой созданной отдельной сущности - PullRequest
1 голос
/ 01 марта 2010

Допустим, я создал новый продукт, подобный этому:

Product p=new Product(){ Id= 2,Name="some name"};

Моя переменная продукта никогда не была присоединена к контексту данных, как я могу присоединить эту сущность, чтобы мой существующий продукт в базе данных с Id = 2 получил обновление с именем моего отдельного продукта?

Ответы [ 3 ]

0 голосов
/ 23 декабря 2010

Немного более простым решением было бы реализовать интерфейс ICloneable на объекте, с которым вы хотели бы работать подобным образом. Затем все, что вам нужно сделать, это вызвать Clone () в «оригинальную» сущность, которую вы извлекли из БД.

Пример:

class Product : ICloneable
{
    public virtual int Id { get; private set; }
    public virtual string Name { get; set; }

    public object Clone()
    {
        return new Product() { Id=this.Id, Name=this.Name };
    }
}

И тогда все, что вам нужно сделать, это:

Datacontext db = new Datacontext(); // replace with your DataContext
Product originalProduct = 
        db.Products.Single(p => p.Id == 2); // get product with Id 2

db.originalProduct = p.Clone()
db.SubmitChanges();

Редактировать: Я столкнулся с той же проблемой на работе, до сих пор самым элегантным решением, которое я нашел, было создание метода расширения, который получает вновь созданную сущность, в вашем случае Product, и копирует ее свойства (кроме идентификатора) в сущность вы извлекли из DataContext.

Я скопировал все свойства с помощью Reflection, таким образом, если я обновлю сущность, тогда мой метод расширения будет работать.

Надеюсь, это вам тоже поможет.

Если вы найдете более элегантное решение этой проблемы, я хотел бы услышать:)

0 голосов
/ 24 декабря 2010

Просто чтобы добавить к посту gillyb и оставленному там комментарию. Очень простой способ клонирования вашей сущности состоит в следующем:

Private Function CloneEntity(Of TEntity)(ByVal entity As TEntity) As TEntity

    Dim dataContext As New DataContext()
    Dim entityType As System.Type = GetType(TEntity)

    ' If the purpose of the clone is just to attach it the existing entity to a new
    ' DataContext, you can use IdentityMembers in place of PersistantDataMembers. Setting
    ' only the IdentityMembers is enough to allow for attaching the clone as an "originaL"
    ' entity to the DataContext.
    Dim dataMembers = dataContext.Mapping.GetTable(entityType).RowType.PersistentDataMembers

    Dim clone As TEntity ' Do something here to create an entity of the desired type. 
    Dim boxedClone As Object = clone

    For Each dm In dataMembers

         ' Depending on how your ColumnAttribute is set, you would use StorageAccessor if
         ' the Storage property is set. Otherwise, you would use MemberAccessor instead.
          dm.StorageAccessor.SetBoxedValue(boxedClone, dm.StorageAccessor.GetBoxedValue(entity))
    Next

    Return clone

End Function

Тогда вам просто нужно сделать это:

Dim dataContext As New DataContext()
dataContext.GetTable(Of Object)().Attach(entityToUpdate, CloneEntity(entityToUpdate))
dataContext.SubmitChanges()
0 голосов
/ 01 марта 2010

Надеюсь, что-нибудь подобное сработает

 Datacontext db = new Datacontext(); // replace with your DataContext
 Product originalProduct = 
         db.Products.Single(p => p.Id == 2); // get product with Id 2

 originalProduct.Name = "SomeName";  // only reset Name prop
 originalProduct = p;                // or you may assign p to originalProduct
 db.SubmitChanges();                 // submit changes to DB
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...