0

我正在尝试创建一个通用函数,用于访问我的数据库中的多个表。有没有办法在我的通用函数中使用复数(非英国人的复数!)表名。

我可能会以错误的方式思考这个问题(对泛型/模板来说相当新),但这是我的代码(Db只是用于访问我的数据库的全局变量):

public void UpdateMyTables<TEntity>() {
    // string plural = EntityObject<TEntity>.GetTableName(); // OR SOMETHING SIMILAR??
    IEnumerable<EntityType> entitiesToUpdate = Db.<TEntity>; // Obviously doesn't work because TEntity is not a table name, it's an object type

    foreach(<TEntity> e in entitiesToUpdate) {
        e.MyColumn = "A string that I'm updating all these fields with";
    }
}

所以我的问题是:我是否需要做一些骇客来获取复数表名,或者是否有一个函数旨在返回这个(如 GetTableName),或者我应该从不同的角度来解决这个问题?

我还在这里找到了一个有助于手动转换的链接:Pluralising in mvc

拥抱和亲吻并提前感谢...

4

1 回答 1

2

您可以使用该.Set()方法获取 IEnumerable:

IEnumerable<TEntity> entitiesToUpdate = Db.Set<TEntity>(); 

要获取表名,您可以使用此博客文章或此SO 答案中的代码。

foreach应该写成:

foreach(TEntity e in entitiesToUpdate) { // you can use "var" here if you prefer
    e.MyColumn = "A string that I'm updating all these fields with";
}

现在,问题是TEntity没有.MyColumn属性。如果将此方法用于继承自具有该属性的基类(例如 BaseEntity)的实体,则可以像这样更改方法声明:

public void UpdateMyTables<TEntity>() where TEntity : BaseEntity {

这限制了您只能使用继承自 BaseEntity 的实体调用此方法,但您可以访问在BaseEntity.

为了使上面的代码工作,基本实体应该这样声明:

public class BaseEntity { //of course it can be abstract or an interface...
    public string MyColumn { get; set; }
}

我希望我明白你想做什么。如果您需要更多信息,请告诉我们。:)

于 2013-04-30T11:10:17.480 回答