我有一个抽象的基类审计的性质。为简洁起见说,它有一个酒店

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
{
}

然后推翻了 SubmitChangesDataContext 检查执行情况的口与魔术的皇宫 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);
}

希望这可以帮助!-凯莉

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top