2011-05-15 28 views
0

这并不像它的一个人群来源的代码审查的一个问题...扩展的DbContext使用通用输入(...)

我注意到你可以使用context.Entry(itemToModify)添加对象以及更新&删除一个catch,itemToModify的类型必须指定,它不能是通用的。

如果我能解决泛型类型问题,我可以消除并简化我的代码。

下面是我做什么,它的工作原理在本地,让我知道你在想什么,如果你看到问题等

public static class ExtensionMethods 
{ 
    public static bool ModifyContext<T>(this DbContext context, T itemToModify, EntityState state) where T : class 
    { 
     // Function that throws a null arg exception 
     ValidationFunctions.IsNotNull(itemToModify); 

     context.Entry(itemToModify).State = state; 

     return context.SaveChanges() > 0; 
    } 
} 

public class PersonRepository : IPersonRepository 
{ 
    private readonly SomeContext _context = new SomeContext(); 

    /// <summary> 
    /// Add a person 
    /// </summary> 
    public bool Add(Person personToAdd) 
    { 
     return _context.ModifyContext(personToAdd, EntityState.Added); 
    } 

    // Edit, Delete etc ... 
} 

回答

1

我不明白你的代码。你为什么用这个:

var type = itemToModify.GetType(); 
var item = Convert.ChangeType(itemToModify, (Type)type); 
context.Entry(item).State = state; 

当你强类型实体?

为什么不只需使用这个:

context.Entry(itemToModify).State = state; 

context.Entry<T>(itemToModify).State = state; 
+0

我最初从第一编码的变化评论,它似乎并不像交换到的普通版本一样简单条目。我将深入探讨这个问题,当我对问题有更好的了解时我会发布 – matto0 2011-05-15 22:30:25

+0

在原始代码中,您无法直接为TEntity插入itemToModify。在非泛型Entry()中,TEntity要求它是一个类,并且itemToModify可以是任何类型(引用或不是)。通过添加类限制的行:'context.Entry(itemToModify).State'现在工作。我的原始代码通过获取类类型的itemToModify来解决问题,并将对象转换回该类型。虽然它工作,但它是混乱,并正在做额外的工作。谢谢你的帮助。 – matto0 2011-05-15 23:02:29