Asp.net mvc 实体框架-定义不需要任何一方的连接
我有一个问题,我必须创建一个模型,其中有两个实体可以链接在一起,但也可以作为独立实体存在 当前的模型如下所示:Asp.net mvc 实体框架-定义不需要任何一方的连接,asp.net-mvc,entity-framework-6,ef-fluent-api,Asp.net Mvc,Entity Framework 6,Ef Fluent Api,我有一个问题,我必须创建一个模型,其中有两个实体可以链接在一起,但也可以作为独立实体存在 当前的模型如下所示: public class Authorisation { public int AuthorisationID { get; set; } public virtual Change Change { get; set; } } public class Change { public int ChangeID{ get; set; } pu
public class Authorisation
{
public int AuthorisationID { get; set; }
public virtual Change Change { get; set; }
}
public class Change
{
public int ChangeID{ get; set; }
public virtual Authorisation Authorisation { get; set; }
public int? AuthorisationID{ get; set; }
}
这样做的原因是,我们可以有一个独立于变更的授权记录,有些变更需要授权,有些则不需要,因此不需要任何一方的关系
我可以使用fluent API对此进行如下配置:
modelBuilder.Entity<Authorisation>()
.HasOptional(t => t.Change)
.WithOptionalPrincipal(t => t.Authorisation);
EF决定为我添加一个新列(authorization\u authorizationId)作为两个实体之间的FK,我真正想做的是使用change.authorizationId属性作为授权的FK,我根本找不到配置的方法(请注意,我需要FK在模型中-为了与应用程序的其余部分保持一致,而不是其他任何东西)
总之,我需要能够在两个实体之间创建一个关系,其中关系的双方都是可选的,如果可能的话,我希望能够自己定义FK列
我只是走错路了吗?我盯着同一块代码看了这么久,可能错过了一些简单的东西。看起来
一对一关系不支持显式外键属性-没有HasForeignKey
Fluent API,而且如果在n上放置ForeignKey
属性导航属性您得到一个异常,即多重性必须是*
因此,您唯一的选择是删除显式的Change.authorizationId
属性,并仅使用导航属性:
型号:
配置:
modelBuilder.Entity()
.has可选(t=>t.Change)
.具有期权委托人(t=>t.授权)
.Map(a=>a.MapKey(“授权ID”);
看起来一对一关系不支持显式外键属性-没有HasForeignKey
Fluent API,而且如果在导航属性上放置ForeignKey
属性,则会出现异常,指出多重性必须是*
因此,您唯一的选择是删除显式的Change.authorizationId
属性,并仅使用导航属性:
型号:
配置:
modelBuilder.Entity()
.has可选(t=>t.Change)
.具有期权委托人(t=>t.授权)
.Map(a=>a.MapKey(“授权ID”);
为了澄清,在对代码进行一点挖掘并查看应用程序实际将什么放入数据库后,我遇到的问题实际上更多,我需要自己指定FK,或者至少能够从实体实例中获取自动生成的密钥。为了澄清,在对编写代码并查看应用程序实际将什么放入数据库我遇到的问题实际上更多的是我需要自己指定FK,或者至少能够从实体的实例中获取自动生成的密钥,这就是我所想的。有点痛苦,我可以在更改中设置FK对象而不必检索授权,但我猜这是唯一的选项…谢谢!这就是我的想法。有点痛苦,我可以在更改对象上设置FK而不必检索授权,但我猜这是唯一的选项…谢谢!
CreateTable(
"dbo.Changes",
c => new
{
ChangeID = c.Int(nullable: false, identity: true),
AuthorisationID = c.Int(),
Authorisation_AuthorisationID = c.Int(),
})
.PrimaryKey(t => t.ChangeID)
.ForeignKey("dbo.Authorisations", t => t.Authorisation_AuthorisationID)
.Index(t => t.Authorisation_AuthorisationID);
public class Authorisation
{
public int AuthorisationID { get; set; }
public virtual Change Change { get; set; }
}
public class Change
{
public int ChangeID{ get; set; }
public virtual Authorisation Authorisation { get; set; }
}
modelBuilder.Entity<Authorisation>()
.HasOptional(t => t.Change)
.WithOptionalPrincipal(t => t.Authorisation)
.Map(a => a.MapKey("AuthorisationID"));