我有两个对象(UserProfile和Login)驻留在不同的程序集中,我必须在SQL Server中创建它们之间的关系(我不关心DbContext关系,但是我想要确保数据库在各自表之间的参照完整性。)
最简单的方法是更新数据库(我首先使用代码)并运行alter table来创建关系,但我认为这种方法很脏(即使在Up方法中使用SqlResource)。
我尝试使用HasOptional和Map方法创建这种关系失败了(流畅的api说当我尝试类似" HasOptional(a => a.IdUsuario)时,ProfileId不是参考类型... &#34)
。// UserContext's Classes (Assembly 'A')
public class UserProfile
{
public int Id { get; set; } // PK
// some properties omitted
}
public class UserContext : DbContext
{
DbSet<UserProfile> UsersProfiles { get; set; }
}
// SecurityContext's Classes (Assembly 'B')
public class Login
{
public int Id { get; set; }
public string UserName { get; set; }
public int ProfileId { get; set; } // UserProfile's FK
}
public class SecurityContext : DbContext
{
DbSet<Login> Logins { get; set; }
}
我尝试引用这两个类,包含导航属性并使用&#34; modelBuilder.Ignore&lt;&gt;&#34;选择我想在每个上下文中实际同步的类,但这以循环引用问题结束。
我收到了消息&#34;导航属性&#39; UserProfile&#39;不是类型&#39;登录&#39;的声明属性。验证它是否未从模型中明确排除,并且它是有效的导航属性。&#34;如果尝试创建假类只是为了映射目的。
我错过了什么吗?
答案 0 :(得分:2)
是的,你错过了一些观点。
UserProfile
是弱实体,它是Login
的依赖。关系是1:1。 1 Login
有1 UserProfile
。
你的课程应该是这样的:
public class UserProfile
{
//UserProfile does not have its own Id,
//Its Id is the LoginId, which is the primary key and a foreign key
//It ensures the 1:1 relationship
public int LoginId { get; set; } // PK and FK
// some properties omitted
public Login Login { get; set; }
}
public class Login
{
public int LoginId { get; set; }
public string UserName { get; set; }
//Login does not have UserProfile fk
//because it is the Principal of the relationship
public UserProfile Profile { get; set; }
}
映射:
modelBuilder.Entity<UserProfile>()
.HasKey(i => i.LoginId);
modelBuilder.Entity<Login>()
.HasKey(i => i.LoginId);
modelBuilder.Entity<Login>()
.HasRequired(i => i.Profile)
.WithRequiredPrincipal(i => i.Login)
.WillCascadeOnDelete(false);
生成的迁移:
CreateTable(
"dbo.Logins",
c => new
{
LoginId = c.Int(nullable: false, identity: true),
UserName = c.String(),
})
.PrimaryKey(t => t.LoginId);
CreateTable(
"dbo.UserProfiles",
c => new
{
LoginId = c.Int(nullable: false),
})
.PrimaryKey(t => t.LoginId)
.ForeignKey("dbo.Logins", t => t.LoginId)
.Index(t => t.LoginId);
修改强>
由于Login
不属于域程序集,Login
是弱实体。 Login
的依赖关系为UserProfile
。
public class UserProfile
{
public int UserProfileId { get; set; } // PK
// some properties omitted
// we don't have Login property here
}
public class Login
{
//login pk must be userprofile FK
//so it ensures the 1:1 relationship
public int UserProfileId { get; set; } //PK
public string UserName { get; set; }
public UserProfile Profile { get; set; }// UserProfile's FK
}
映射:
modelBuilder.Entity<Login>()
.HasKey(i => i.UserProfileId);
modelBuilder.Entity<Login>()
.HasRequired(i => i.Profile)
.WithRequiredDependent();
生成的迁移
CreateTable(
"dbo.UserProfiles",
c => new
{
UserProfileId = c.Int(nullable: false, identity: true),
})
.PrimaryKey(t => t.UserProfileId);
CreateTable(
"dbo.Logins",
c => new
{
UserProfileId = c.Int(nullable: false),
UserName = c.String(),
})
.PrimaryKey(t => t.UserProfileId)
.ForeignKey("dbo.UserProfiles", t => t.UserProfileId)
.Index(t => t.UserProfileId);