在不同的Entity Framework DbContexts中的2个实体之间创建数据库关系

时间:2015-09-18 21:19:25

标签: c# entity-framework entity-framework-6

我有两个对象(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;如果尝试创建假类只是为了映射目的。

我错过了什么吗?

1 个答案:

答案 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);