【问题标题】:Association of a single property from different table in EF 4.3EF 4.3 中不同表中单个属性的关联
【发布时间】:2012-07-25 19:01:35
【问题描述】:

我有两个具有以下定义的表:

    CREATE TABLE [dbo].[Shows] (
    [Id]              UNIQUEIDENTIFIER NOT NULL,
    [Name]            NVARCHAR (1024)  NOT NULL,
    [Image]           NVARCHAR (1024)  NULL,
    [Description]     NTEXT            NULL,
    [Seasons]         INT              NOT NULL,
    [FacebookId]      BIGINT           NULL,
    [BackgroundImage] NVARCHAR (200)   NULL,
    [TheTvDbId]       BIGINT           NULL,
    [NetworkId]       UNIQUEIDENTIFIER NOT NULL,
    CONSTRAINT [PK_Shows] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_Shows_ToNetworks] FOREIGN KEY ([NetworkId]) REFERENCES [dbo].[Networks] ([Id])
);

        CREATE TABLE [dbo].[TheTvDb]
    (
        [Id] UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL, 
        [EntityId] UNIQUEIDENTIFIER NOT NULL, 
        [TheTvDbId] BIGINT NOT NULL,
        [LastUpdated] BIGINT NOT NULL DEFAULT 0, 
        CONSTRAINT [AK_TheTvDb_EntityId] UNIQUE ([EntityId]),
        CONSTRAINT [AK_TheTvDb_TheTvDbId] UNIQUE ([TheTvDbId])
    )

我要做的是在Shows 表上创建一个关联属性TheTvDbLastUpdated,它指向表TheTvDb 的属性LastUpdatedTheTvDb 记录与Shows 记录的关键链接是EntityId。关系是一对一的。我知道如何创建将链接到整个 TheTvDbTable 的关联,但我不知道如何仅链接到这个属性,这样可以更方便地从生成的实体类中访问它。谢谢。

我使用数据库优先的方法,所以我正在从 .edmx 文件的设计者那里寻找一种方法。

【问题讨论】:

    标签: .net entity-framework associations edmx


    【解决方案1】:

    这是不可能的。 “指向”某物的属性是引用/导航属性。您不能将标量/值类型设为导航属性。

    方便的助手可能是只读助手属性(在部分类文件中实现,而不是 EDMX):

    public partial class Show
    {
        public long TheTvDbLastUpdated { get { return this.TheTvDb.LastUpdated; } }
    }
    

    其中TheTvDb 是从ShowTheTvDb 的一对一导航属性。如果您使用延迟加载访问此属性,如果尚未加载,则首先从数据库加载TheTvDb 实体。如果你不使用延迟加载 TheTvDb 可以是 null 并且访问该属性会导致异常。您可能会遇到这种情况:

    public long TheTvDbLastUpdated
    {
        get
        {
            if (this.TheTvDb == null)
                throw new InvalidOperationException(
                    "TheTvDbLastUpdated cannot be accessed before TheTvDb is loaded.");
            return this.TheTvDb.LastUpdated;
        }
    }
    

    不管怎样,你需要导航属性,如果你写show.TheTvDbLastUpdated而不是show.TheTvDb.LastUpdated,这看起来不是一个很大的胜利(实际上胜利只是节省了一个点)。

    【讨论】:

      【解决方案2】:

      还有一个替代解决方案 - 您首先使用数据库,因此您可以简单地创建一个视图,该视图将提供您的投影并映射视图而不是表格。新实体将是只读的,因为 EF 不知道如何更新隐藏在视图后面的原始表 - 这个限制可以通过将存储过程映射到插入、更新和删除功能来解决。

      View 还可以解决 EF 对您的数据库的其他问题

      • 您的 TheTvDb 似乎没有主键 - 没有主键的表在 EF 中是只读的
      • 您正在尝试在Shows.IdTheTvDb.EntityId 之间建立一对一的关系。在您的数据库中,该关系是一对一的,因为您对 EntityId 具有唯一约束,但在 EF 中,此关系将是一对多的,因为 EF 尚不支持唯一约束

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-24
        • 2019-02-06
        • 1970-01-01
        • 2016-01-31
        相关资源
        最近更新 更多