强制 HasMany() 使用关联 table
force HasMany() to use an association table
这里是第一个问题,即使我多年来一直在浏览堆栈。
我对 Entity Framework 和迁移有疑问,更准确地说是映射。
我很清楚所有关于多对多、一对多、关联 table 之类的问题,但我还没有找到针对这个特定问题的解决方案:
这些是我的 POCO:
public class A
{
public virtual long Id {get; set;}
public virtual ICollection<B> B {get; set;}
}
public class B
{
public virtual long Id {get; set;}
// Not relevant stuff ...
}
我想强制映射给我一个关联 table,可能看起来像这样:
----------- ----------- -----------
| TABLE A | | TABLE AB| | TABLE B |
----------- ----------- -----------
| ID | | FK_A_ID | | ID |
----------- | FK_B_ID | -----------
-----------
我的第一反应是使用这种映射:
modelBuilder.Entity<A>()
.HasMany(x => x.B)
.WithMany()
.Map(x =>
{
x.ToTable("AB");
x.MapLeftKey("Id");
x.MapRightKey("Id");
});
不幸的是,这并没有给我所需的数据库映射,因为它在 table A 引用 B.Id 中创建了一个外键。另外,我不想在 B class 中的 A 上有一个 属性。有关信息,目标数据库是 SqlServer。
有没有正确的方法来做到这一点?
注意:我的母语不是英语,如有错误请见谅。
不确定您为什么要尝试实现该目标,但这是可能的。
我想到的假设是您既不能编辑 A
也不能编辑 B
但您想要很多很多的关系...所以这是一个解决方案:
只需创建一个 ID 为 A
和 B
的 class AB
,然后使用装饰器
定义键和鉴别器
class AB {
virtual public A ALink {get; set;}
[Key, Column(Order = 0)]
public int ALinkId {get; set;}
virtual public B BLink {get; set;}
[Key, Column(Order = 1)]
public it BLinkId {get; set;}
}
这里是第一个问题,即使我多年来一直在浏览堆栈。
我对 Entity Framework 和迁移有疑问,更准确地说是映射。 我很清楚所有关于多对多、一对多、关联 table 之类的问题,但我还没有找到针对这个特定问题的解决方案:
这些是我的 POCO:
public class A
{
public virtual long Id {get; set;}
public virtual ICollection<B> B {get; set;}
}
public class B
{
public virtual long Id {get; set;}
// Not relevant stuff ...
}
我想强制映射给我一个关联 table,可能看起来像这样:
----------- ----------- -----------
| TABLE A | | TABLE AB| | TABLE B |
----------- ----------- -----------
| ID | | FK_A_ID | | ID |
----------- | FK_B_ID | -----------
-----------
我的第一反应是使用这种映射:
modelBuilder.Entity<A>()
.HasMany(x => x.B)
.WithMany()
.Map(x =>
{
x.ToTable("AB");
x.MapLeftKey("Id");
x.MapRightKey("Id");
});
不幸的是,这并没有给我所需的数据库映射,因为它在 table A 引用 B.Id 中创建了一个外键。另外,我不想在 B class 中的 A 上有一个 属性。有关信息,目标数据库是 SqlServer。
有没有正确的方法来做到这一点?
注意:我的母语不是英语,如有错误请见谅。
不确定您为什么要尝试实现该目标,但这是可能的。
我想到的假设是您既不能编辑 A
也不能编辑 B
但您想要很多很多的关系...所以这是一个解决方案:
只需创建一个 ID 为 A
和 B
的 class AB
,然后使用装饰器
class AB {
virtual public A ALink {get; set;}
[Key, Column(Order = 0)]
public int ALinkId {get; set;}
virtual public B BLink {get; set;}
[Key, Column(Order = 1)]
public it BLinkId {get; set;}
}