gpt4 book ai didi

entity-framework - Entity Framework : Mapped multiple Tables into one Entity -Insert problems

转载 作者:行者123 更新时间:2023-12-04 08:35:22 24 4
gpt4 key购买 nike

今天我有一个 Entity Framework 问题。我有两个表:Projects 和 Projects_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);

    我想出了如何防止 Entity Framework 来自 更新 CurrentIdentity__Implementation__(=Identity) & CurrentAccessRights__Implementation__(=Right)。这是通过设置 StoreGeneratedPattern="Computed"在 SSDL 中完成的。
      <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 中。效果很好!

    我的问题是:如何防止 Entity Framework 来自 插入 Project_Rights 表中的记录?在那里添加记录是由触发器/函数完成的。

    感谢您为我指明正确的方向!

    编辑:

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

    我创建了一个 View
    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

    此 View 是可更新的。为了能够删除一行,我实现了这个触发器:
    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

    现在我可以将此 View 映射为 Entity Framework 中的“表”。 [Identity] 和 [Rights] 被映射为计算列。

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

    最佳答案

    如果您想对插入和更新进行更精细的控制,则需要使用 StoredProcedures 进行插入/更新/删除操作。

    不幸的是,更新/插入/删除的范围是实体,您无法更细化并配置 Sproc(对于一个表)和标准 T-SQL(对于另一个表)。

    这意味着如果您需要覆盖对 Projekt_Rights 表的控制,您也必须对 Projekt 表执行此操作。

    退房 this sample更多。

    注意:如果您需要为插入执行此操作,不幸的是您也必须为更新和删除执行此操作。

    希望这可以帮助

    亚历克斯

    关于entity-framework - Entity Framework : Mapped multiple Tables into one Entity -Insert problems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2051164/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com