.net core EF核心:无唯一约束的原则?

.net core EF核心:无唯一约束的原则?,.net-core,entity-framework-core,ef-core-3.1,.net Core,Entity Framework Core,Ef Core 3.1,我一直在玩弄EF Core 3.1,试图在两个类之间建立关系。诀窍是一个类上的复合键,而另一个类仅通过一个部分与之相关 考虑以下几点: 公共A类 { 公共字符串Foo{get;set;} 公共长Id{get;set;} 公共IEnumerable B{get;set;} } 公共B级 { [关键] 公共int Id{get;set;} 公共字符串条{get;set;} } ... 模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder) { modelBuilder.En

我一直在玩弄EF Core 3.1,试图在两个类之间建立关系。诀窍是一个类上的复合键,而另一个类仅通过一个部分与之相关

考虑以下几点:

公共A类
{
公共字符串Foo{get;set;}
公共长Id{get;set;}
公共IEnumerable B{get;set;}
}
公共B级
{
[关键]
公共int Id{get;set;}
公共字符串条{get;set;}
}
...
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity(b=>
{
b、 HasKey(x=>new{x.Id,x.Foo});
b、 HasMany(x=>x.b)
.WithOne()
.HasPrincipalKey(x=>x.Id);
});
}
这将创建以下迁移:

migrationBuilder.CreateTable(
名称:“A”,
列:表=>new
{
Foo=table.Column(可空:false),
Id=table.Column(可空:false)
},
约束:表=>
{
表.PrimaryKey(“PK_A,x=>new{x.Id,x.Foo});
表.UniqueConstraint(“AK_A_Id”,x=>x.Id);
});
migrationBuilder.CreateTable(
名称:“B”,
列:表=>new
{
Id=table.Column(可空:false)
.Annotation(“Sqlite:Autoincrement”,true),
Bar=表列(可为空:true),
AId=table.Column(可空:true)
},
约束:表=>
{
表.PrimaryKey(“PK_B”,x=>x.Id);
表1.外键(
名称:“FK_B_A_AId”,
列:x=>x.AId,
原则性:“A”,
主栏:“Id”,
onDelete:referentialiction.Restrict);
});
migrationBuilder.CreateIndex(
名称:“IX_B_援助”,
表:“B”,
专栏:“援助”);

这几乎就是我想要的,除了表A上的UniqueConstraint!有办法解决这个问题吗?

这是不可能的。不是因为EF核心,而是关系多重性(基数)的定义

从从属到主体的直接FK关系是到(具有多重性)1(或零或一个0..1,如果是可选关系),即FK必须准确标识一个主体记录。这就是为什么引用的主键必须是唯一的,这由主键或唯一键约束来满足


您所要求的允许依赖记录引用多个(即多个)匹配的主体记录。换句话说,对许多基数而言。使用依赖表中的FK无法实现这一点,但需要典型的中间链接(join)实体/表关系。

您是否尝试过从迁移中删除唯一约束,然后使用示例数据运行一些示例查询?并不是说我会发现这种关系是正确的(因为至少
with one()
部分有很多(x=>x.B)
是错误的)。但是为什么不试一下呢?那么,您有两个As键,分别是
“abc”,1
“def”,1
。现在你有了一个
B
AId
1
。它属于这两个词中的哪一个?没有唯一约束的原则性短语是自相矛盾的。根据定义,主键是唯一的。否则它甚至不能是一个键,更不用说主键了。主键是选择用于唯一标识记录的多个候选键中的一个。所有候选密钥都是唯一的,但PK是为其选择的密钥use@Namoshek老实说,我没有尝试,因为我真的不想手动编辑迁移文件,我想寻找一个合适的解决方案:)@Damien_,不信者,我明白你的意思,但是如果我们讨论的是聚合关系而不是组合呢。这不受支持吗?我们忽略了我定义它的尝试是什么?没有MTM表,有没有办法做到这一点?我猜这是一种聚合关系,我认为这种关系不需要额外的表就可以实现。@MattImmer它是OTM和FK在dependent,或者MTM和额外的表。在关系数据库中没有其他选择。好吧,这也是我学习数据库工作的方式:)我只是在想EF Core是否提供了处理这种关系的方法。这是一个使用连接处理的非常简单的关系,也许EF-Core可以处理这个抽象。