我有这个:
public class Foo
{
public int Id { get; set; }
public Bar Bar { get; set; }
}
public class Bar
{
public int Something { get; set; }
public int SomethingElse { get; set; }
}
我的数据库是这样的:
CREATE TABLE [Foo](
[Id] INT,
[Bar_Something] INT NOT NULL,
[Bar_SomethingElse] INT NOT NULL,
)
当我获得数据库上下文时
public class DB: DbContext
{
public DbSet<Foo> Foo { get; set; }
}
Foo.Id
已正确映射,但Bar
无法映射且出现此错误System.InvalidOperationException : The entity type 'Bar' requires a primary key to be defined.
我不想创建Bar表并将其ID作为FK提供给Foo。
如何将列Bar_Something
和Bar_SomethingElse
映射到Foo.Bar.Something
和Foo.Bar.SomethingElse
?
答案 0 :(得分:1)
EF Core 2.0和更高版本支持Owned entity types。默认情况下,这些映射是使用Table splitting进行的。
在EF Core 2.1中,您可能只需要向[Owned]
添加Bar
属性,即:
[Owned]
public class Bar
{
public int Something { get; set; }
public int SomethingElse { get; set; }
}
所拥有类型的属性将映射到名为Property_OwnedProperty
的同一表中的字段。在这种情况下,它将是Bar_Something
和Bar_SomethingElse
看起来有人在设计表格时考虑了这些要求。
在EF Core 2.0中,您需要在上下文配置中指定拥有的类型:
modelBuilder.Entity<Foo>().OwnsOne(p => p.Bar);
答案 1 :(得分:0)
您似乎正在寻找的是表拆分-Bar
的第二个实体仍然需要一个ID字段,尽管它与Foo
对象所使用的字段相同,这意味着它会以1-1的基础完美地加入他们。
这允许您将表的ID字段映射到多个对象,然后成为联接的主键和外键。
作为一个非常简单的博客文章演示,您可以在Here上阅读有关此示例的快速示例。
这也可以使用[Owned]
属性来完成-使用拥有的对象和简单地将两个对象映射到同一张表之间的区别在于,拥有的对象将永远只是一个导航属性-因此您将无法只需查找Bar
,您将始终需要查找Foo
并包含Bar
。
根据您希望它们的行为方式(独立或依赖),您可以使用两个选项进行表拆分。
答案 2 :(得分:0)
要在Bar类中定义的主键。
public class Bar
{
[Key]
public int Something { get; set; }
public int SomethingElse { get; set; }
}