1

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

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

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

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

4

2 回答 2

1

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

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

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

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

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(实际上胜利只是节省一个点)。

于 2012-07-25T22:02:06.363 回答
1

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

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

  • 看起来您TheTvDb没有主键 - 没有主键的表在 EF 中是只读的
  • Shows.Id您正在尝试在和之间建立一对一的关系TheTvDb.EntityId。在您的数据库中,关系是一对一的,因为您有唯一约束,EntityId但在 EF 中,这种关系将是一对多的,因为 EF 还不支持唯一约束
于 2012-07-26T07:59:26.737 回答