用户可以拥有1或0个帐户
public class User
{
public int UserId { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public Account Account { get; set; }
}
public class Account
{
public int AccountId { get; set; }
public DateTime CreatedDateTime { get; set; }
public User User { get; set; }
}
这是使用实体框架6
的流利API代码public class ClassDbContext: DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasOptional(s => s.Account)
.WithRequired(ad => ad.User);
}
public DbSet<User> Users { get; set; }
public DbSet<Account> Accounts { get; set; }
}
这是结果结果
使用实体框架核心的等效流利API代码是什么?
@tseng已接近,但还不够。使用建议的配置,您将获得消息,并获得消息:
无法确定" account.user"one_answers" user.account"之间检测到的一对一关系的孩子/依赖方面。要识别关系的儿童/依赖方面,请配置外国密钥属性。有关更多详细信息,请参见http://go.microsoft.com/fwlink/?linkid=724062。
基本上是在文档中从链接中解释的。
首先,您需要使用HasOne
和WithOne
。
第二,您必须使用 HasForeignKey
指定两个实体中的哪一个是依赖(当一个在一个中没有单独的FK属性时,无法自动检测到它实体(。
第三,不再需要所需的依赖。IsRequired
方法可用于指定当依赖实体使用单独的fk时(而不是PK,即在您的情况下,即使用所谓的共享主键关联,因为PK显然显然是PK不能为null(。
话虽如此,张贴模型的正确F核心流利配置如下:
modelBuilder.Entity<User>()
.HasOne(e => e.Account)
.WithOne(e => e.User)
.HasForeignKey<Account>(e => e.AccountId);
的结果是:
migrationBuilder.CreateTable(
name: "User",
columns: table => new
{
UserId = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
Email = table.Column<string>(nullable: true),
Name = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_User", x => x.UserId);
});
migrationBuilder.CreateTable(
name: "Account",
columns: table => new
{
AccountId = table.Column<int>(nullable: false),
CreatedDateTime = table.Column<DateTime>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Account", x => x.AccountId);
table.ForeignKey(
name: "FK_Account_User_AccountId",
column: x => x.AccountId,
principalTable: "User",
principalColumn: "UserId",
onDelete: ReferentialAction.Cascade);
});
与其他名称几乎相同。
modelBuilder.Entity<User>()
.HasOne(s => s.Account)
.WithOne(ad => ad.User)
.IsRequired(false);