我有一个“资产”表,用于存储上传到网站的文件信息(图像、pdf、文档等)。
这些文件可以是新闻文章的照片、会员的头像、文章的 pdf 文件等。
我在所有表中都有独特的“Guid”字段。这样我就可以通过“Assets”表中的“Guid”字段访问属于任意表中数据的所有文件了
例如Id为12的新闻的所有资产:
SELECT News.Title, Assets.Filename FROM News INNER JOIN Assets ON News.Guid = Assets.Guid WHERE News.Id=12
例如Id为179的用户的所有资产:
SELECT Users.Fullname, Assets.Filename FROM Users INNER JOIN Assets ON Users.Guid = Assets.Guid WHERE Users.Id=179
是否可以在不单独为所有表定义外键的情况下执行此操作?
如果可以的话,如何通过实体框架建立这种关系?
可以通过向
Category
和 Product
添加 Asset
导航属性和可选的 Asset
来建立 AssetId
和 Category
与 Product
的 1:1 关系。
像您所描述的新闻那样的多对多关系可以通过链接到两个的临时表更好地建模。在 EF 中定义链接表(而不是仅在数据库级别作为影子表)的实际原因是,您可能会拥有有关 Asset 的其他元数据以及它与文章的关系,通常是排序、索引和其他布局信息。
我不会包含从
返回到任何这些链接表的反向导航属性,在 EF 中,像 migrations 这样的架构更改管理工具随着时间的推移只会造成一团混乱的影子链接表。Asset
因此,这意味着添加一个
NewsAsset
实体,该实体具有 N : 1
和 News
以及 1 : 1
和 Asset
。