我正在WPF应用程序中对Database生成的类(使用LINQ2SQL)进行CRUD操作。我的所有数据库表都存在IsDelete属性。所以我想定义一个抽象/接口类来做SoftDelete()。我的问题是,如何以访问T.IsDelete = true的方式定义我的Generic类?或者在代码中我想做类似下面的事情
public abstract class CRUDOperations <T> : where T is????
{
.......
protected virtual SoftDelete()
{
T.IsDeleted = true;
}
}
其中T是由DBQ生成的表类LINQ To SQL(DBML),我不能在它上面强加一个接口或基类?或者DB中是否有一种技术可以使基表具有与C#
相同的Base / Derive概念答案 0 :(得分:3)
1)定义ISoftDelete
public interface ISoftDelete
{
bool IsDeleted { get; set; }
}
2)为所有实体创建部分类
public partial class MyLinqEntity : ISoftDelete { }
public partial class MyOtherLinqEntity : ISoftDelete { }
public partial class MyFurtherLinqEntity : ISoftDelete { }
3)将您的界面添加到通用类型限制
public abstract class CRUDOperations <T> : where T is ISoftDelete
答案 1 :(得分:2)
您可以在界面上声明:
public interface ICanDelete {
bool IsDeleted {get;set;}
}
让隐式接口实现发挥其神奇作用。然后问题变成:“如何让它知道我的实体实现了这个接口?”。两个选项:
为每个实体添加一个部分类(在不同的文件中):
partial class Customer : ICanDelete {}
partial class Order : ICanDelete {}
编辑dbml以将此接口指定为基类:
<Database EntityBase="Some.NameSpace.ICanDelete" ... >
(这使得LINQ-to-SQL的代码生成为您添加: Some.NameSpace.ICanDelete
)
然后在通用子句中使用此接口:
where T : ICanDelete
答案 2 :(得分:0)
数据库生成的类不是从实体派生的吗?