我有两张表,其中包含以下定义:
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文件的设计者那里做到。
答案 0 :(得分:1)
那是不可能的。 “指向”某些内容的属性是引用/导航属性。您不能将标量/值类型设为导航属性。
一个方便的帮助器可能是一个只读辅助属性(在部分类文件中实现,而不是EDMX):
public partial class Show
{
public long TheTvDbLastUpdated { get { return this.TheTvDb.LastUpdated; } }
}
其中TheTvDb
是从Show
到TheTvDb
的一对一导航属性。如果使用延迟加载访问此属性,则首先从数据库加载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.Id
和TheTvDb.EntityId
之间建立一对一的关系。在您的数据库中,关系是一对一的,因为您对EntityId
有唯一约束,但在EF中,这种关系将是一对多的,因为EF不支持唯一约束