【发布时间】:2019-01-27 17:03:17
【问题描述】:
我知道一个现实的选择是更改建议的数据库架构;我也在追求这个选择。但是...我想知道是否可以设置 EF 以便它理解这种结构 ....
商业模式:
- 每个 Foo 都与一个 Bar 相关联。
- 每个 Bar 可以有多个 Foo。
- 每个 Bar 也可能有一个 特殊 Foo,(尽管可能没有)
强制“一个 Bar 的特殊 Foo 必须与那个 Bar 相关联”的一致性是代码库的责任,而不是数据库的责任。
理想情况下,执行“一个 Bar 不能有多个特殊 Foo”的一致性是数据库的责任。
选择的数据库模型:
如上所述,我知道存在其他可能的结构,它们具有许多优点(尤其是“在 EF 中更容易配置”)。
CREATE TABLE [dbo].[Foo] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[BarId] INT NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_Bar] FOREIGN KEY ([BarId]) REFERENCES [dbo].[Bar] ([Id])
);
CREATE TABLE [dbo].[Bar] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[SpecialFooId] INT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_SpecialFoo] FOREIGN KEY ([SpecialFooId]) REFERENCES [dbo].[Foo] ([Id])
);
当前对领域模型的猜测:
public class Foo
{
public int Id { get; set; }
// Props for easy 1-many relationship.
public int BarId { get; set; }
public virtual Bar Bar { get; set; }
}
public class Bar
{
public int Id { get; set; }
// Prop for easy 1-many relationship.
public virtual ICollection<Foo> Foos { get; set; }
// Props for hard 1-0..1 relationship.
public int? SpecialFooId { get; set; }
public virtual Foo SpecialFoo { get; set; }
}
我完全不确定这个域对象模型是否适合 EF,我也不知道如何配置它。
有人知道怎么做吗?
【问题讨论】:
-
公共虚拟 ICollection
酒吧?或 Foo 集合 -
@NaDeRStar 谢谢,应该是
ICollection<Foo> Foos -
@NaDeRStar 现已修复
-
注意循环引用,以防你要序列化数据
-
@MostafaELite 同意,绝对值得向任何发现此问题的未来开发者强调!
标签: c# entity-framework