【问题标题】:Entity Framework One to One relation?实体框架一对一关系?
【发布时间】:2016-07-19 18:36:25
【问题描述】:

我已经从我的图表中生成了我的表格:

Database schema 但我不知道为什么,EF 会在 Origin 模型中生成这个:

public virtual ICollection<Container> Containers { get; set; }

在容器模型中:

public int OriginID { get; set; }
public virtual Origin Origin { get; set; }

在上下文中:

modelBuilder.Entity<Origin>()
            .HasMany(e => e.Containers)
            .WithRequired(e => e.Origin)
            .WillCascadeOnDelete(false);

但是一个容器对象只能有一个 Origin 对象。

如何删除集合以使我的对象在源对象中只有一个实例?

因为实际上我的 Restier 服务正在使用仅一个容器的集合检索我的原始对象。

所以收藏完全没用。

你们有什么想法吗?

非常感谢

【问题讨论】:

  • 两个主键之间不应该有关系吗?

标签: c# sql-server entity-framework restier


【解决方案1】:

因为起源很可能与很多容器有关 - 他们不知道。你所拥有的是一个(起源)到多个(容器)。 假设我有 ID 为 1 的原点和带有 originID 1 的容器 A。什么会阻止我添加具有相同 originID 的容器 B?如果您坚持 1 对 1 的关系,请尝试向两个模型添加键 - 来源应该知道它只与一个容器相关,反之亦然。

TD;DR:将 ContainerID 添加到 Origin 表中。

【讨论】:

  • 好吧,我的原始表可以有一个可以为空的“容器”或一个可以为空的“流”。但只有一个。这就是为什么我需要一个 1-1 来轻松检索我的数据。实际上我得到的是: { "ID":1,"Flows":[ ],"Containers":[ { "ID":1,"Name":"M3","Width":0.0,"Length": 0.0,"Height":0.0,"Volume":0.0,"OriginID":1,"DestinationID":13,"DisplayName":"Mercuras" } ] }
【解决方案2】:

我认为添加一对一关系的最佳方法是拥有一个也是外键的主键。

(Origin Id 应该引用 Container id)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2015-05-04
    • 2016-01-27
    • 2020-09-26
    • 1970-01-01
    相关资源
    最近更新 更多