EF 4.3中来自不同表的单个属性的关联

时间:2012-07-25 19:01:35

标签: .net entity-framework associations edmx

我有两张表,其中包含以下定义:

    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])
    )

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

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

2 个答案:

答案 0 :(得分: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,它看起来不是一个大赢家(实际上胜利只是保存一个点)。

答案 1 :(得分:1)

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

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

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