射一个源类表在皇宫-对-SQL
-
20-09-2019 - |
题
我有一个抽象的基类审计的性质。为简洁起见说,它有一个酒店
Public MustInherit Class AbstractAuditableEntity
...
Public Property CreatedTime() As DateTimeOffset
...
End Class
然后我可审计领域对象承受自此类的
Public Class Source
Inherits AbstractAuditableEntity
...
Public Property SourceId() As String
...
End Class
我已经下表所言,我想地图我域对象的"来源"。基本上之间的关系的每一个(具体的)领域对象和表1-1中,每个表格的具有所需的审计列。
CREATE TABLE Source
(
SourceID VARCHAR(10) NOT NULL,
CreatedTime DATETIMEOFFSET(3) NOT NULL,
CONSTRAINT PK_Source PRIMARY KEY (SourceID))
GO
使用一个外部映射文件,我的第一次尝试图类表将愚蠢的是:
<?xml version="1.0" encoding="utf-8"?>
<Database Name="" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007">
<Table Name="Source" Member="Sources">
<Type Name ="Source">
<Column Name="SourceID" Member="SourceID" IsPrimaryKey="true" CanBeNull="false"/>
<Column Name="CreatedTime" Member="CreatedTime" />
</Type>
</Table>
</Database>
但是这产生的以下例外:
列或协会'CreatedTime'在映没有相应的部件的类型"来源". 映成员从上根类型是不支持的。
在该上下文,我持久层我不是想来表示一个继承层次结构作为这样的,但是在上下文中,我申我只是使用一个基类提供所需属性的我的所有领域的对象。有很多摆弄我的映射文件(包括地图的审计列为基AbstractAuditableEntity类型)和阅读周围,我无法实现什么,我认为相当明确对象的任务。
任何想法或建议将是最受欢迎的!感谢
解决方案
凯利表现出伟大的样本的怎么做-但你已经基本上打了一个限制的皇宫-对-SQL。
它的伟大工程,如果你表数据库的地图或多或少的1:1域的对象。但是它的弱点和导致大量的额外工作一旦这不再是这种情况。
在这样的情况下,只要你有域对象的继承和其它事需要映射数据库表,你是最好的选择将是检查了ADO.NET 实体的框架来代替。EF专门设计用于处理这些事情-如果你有没有想"我需要 地图 我的对象。.." 那么你应该认为EF!:-)
当然,目前的EF运费。净3.5sp1有其疣和烦恼,但EF4的一部分。净4.0波(这应该船之前,今年年底2009年),应该解决许多的这些疣!
检查出来的 ADO.NET 实体的框架小组的博客 对于一些筋急转弯的什么EF4将给我们带来所有的!
Marc
其他提示
我猜你试图以模拟审计的领域,如红宝石在轨道上 updated_on
, created_on
.如果是这样,这里是我怎么完成类似的东西使用此后作为一个起点
http://weblogs.asp.net/stevesheldon/archive/2008/02/23/a-method-to-handle-audit-fields-using-linq-to-sql.aspx
我实施的一个接口模型中的名称空间是这样的:
public interface IAuditable
{
DateTime CreatedOn { get; set; }
string CreatedBy { get; set; }
DateTime? ChangedOn { get; set; }
string ChangedBy { get; set; }
}
然后扩展分类的数据实体所有这些领域:
public partial class DataModelIWantToAudit : IAuditable
{
}
然后推翻了 SubmitChanges
在 DataContext
检查执行情况的口与魔术的皇宫 OfType<>
:
public override void SubmitChanges(ConflictMode failureMode)
{
//Updates
foreach (var updatedModel in GetChangeSet().Updates.OfType<IAuditable>())
{
updatedModel.ChangedOn = DateTime.Now;
updatedModel.ChangedBy = Membership.GetUser().UserName;
}
//Inserts
foreach (var insertedModel in GetChangeSet().Inserts.OfType<IAuditable>())
{
insertedModel.CreatedOn = DateTime.Now;
insertedModel.CreatedBy = Membership.GetUser().UserName;
}
base.SubmitChanges(failureMode);
}
希望这可以帮助!-凯莉