代码之家  ›  专栏  ›  技术社区  ›  Arthur

实体框架:将多个表映射到一个实体-插入问题

  •  4
  • Arthur  · 技术社区  · 16 年前

    今天我有一个实体框架问题。我有两个表:Projects和Projects\u Rights

    alt text http://www.zaczek.net/EF-stackoverflow.jpg

    • Project_Rights包含每个项目的每个标识(=用户)的访问权限。此表由触发器/函数计算。

    将这些表映射到 实体没有挑战:

    class Project
    {
        int ID;
        double AufwandGes;
        DateTime CreatedOn;
        ...
        int CurrentIdentity__Implementation__;
        int CurrentAccessRights__Implementation__;
    }
    
    <EntitySetMapping Name="Projekt">
      <EntityTypeMapping TypeName="IsTypeOf(Model.Projekt)">
        <MappingFragment StoreEntitySet="Projekt">
          <ScalarProperty Name="ID" ColumnName="ID" />
          <ScalarProperty Name="AufwandGes" ColumnName="AufwandGes" />
          <ScalarProperty Name="ChangedOn" ColumnName="ChangedOn" />
          <ScalarProperty Name="CreatedOn" ColumnName="CreatedOn" />
          <ScalarProperty Name="Kundenname" ColumnName="Kundenname" />
          <ScalarProperty Name="Name" ColumnName="Name" />
        </MappingFragment>
        <MappingFragment StoreEntitySet="Projekt_Rights">
          <ScalarProperty Name="ID" ColumnName="ID" />
          <ScalarProperty Name="CurrentIdentity__Implementation__" ColumnName="Identity" />
          <ScalarProperty Name="CurrentAccessRights__Implementation__" ColumnName="Right" />
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
    

    var prjList = ctx.GetQuery<Project>()
        // This condition is added automatically by a custom Linq Provider
        .Where(p => p.CurrentIdentity__Implementation__ == Thread.CurrentPrincipal.Identity.ID); 
    

    我已经找到了如何防止实体框架

      <EntityType Name="Projekte_Rights">
        <Key>
          <PropertyRef Name="ID" />
        </Key>
        <Property Name="ID" Type="int" Nullable="false" />
        <Property Name="Identity" Type="int" Nullable="false" StoreGeneratedPattern="Computed" />
        <Property Name="Right" Type="int" Nullable="false" StoreGeneratedPattern="Computed" />
      </EntityType>
    

    我已经宣布了级联 在我的SQL Server和SSDL中。很好!

    插入 是否将记录保存到项目权限表中?通过触发器/函数在那里添加记录。

    谢谢你给我指明了正确的方向!

    编辑:

    我找到了另一种方法。谢谢亚历克斯帮我离开这条路。

    我已经创建了一个视图

    create view Projekte_with_Rights as
    select tbl.*, r.[Identity], r.[Right]
    from Projekte tbl
    inner join Projekte_Rights r on tbl.ID = r.id
    

    create trigger Projekte_with_Rights_DeleteTrigger
    ON Projekte_with_Rights
    INSTEAD OF DELETE AS
    BEGIN
        DELETE FROM Projekte WHERE ID in (SELECT ID FROM deleted)
    END
    

    现在,我可以将此视图映射为实体框架中的“表”[Identity]和[Rights]映射为计算列。

    另一个触发器现在负责填写正确的身份和权限。我还有一个问题。如果我在Projekte_Rights表中插入多行,EF声明一个实体返回了多行。但这是另一个故事,超出了这个问题的范围。

    1 回复  |  直到 16 年前
        1
  •  3
  •   Alex James    16 年前

    如果您希望对插入进行更精细的控制&需要使用StoredProcess进行插入/更新/删除操作的更新。

    不幸的是,更新/插入/删除的范围是实体,您无法获得更细粒度的存储过程(对于一个表)和标准t-SQL(对于另一个表)。

    这意味着如果您需要覆盖Projekt_Rights表的控制,您也必须覆盖Projekt表的控制。

    退房 this sample

    注意:如果您需要为insert执行此操作,很遗憾,您也必须为update和delete执行此操作。

    希望这有帮助

    亚历克斯