m.o*_*men 5 c# entity-framework entity-framework-core ef-fluent-api
用户可以拥有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; }
}
Run Code Online (Sandbox Code Playgroud)
这是使用Entity Framework 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; }
}
Run Code Online (Sandbox Code Playgroud)
这是结果ResultImage
使用Entity Framework Core等效的流畅api代码是什么?
@Tseng很近,但还不够。使用建议的配置,您将获得异常消息:
对于在'Account.User'和'User.Account'之间检测到的一对一关系,无法确定子方/从属方。要标识关系的子级/从属端,请配置外键属性。有关更多详细信息,请参见http://go.microsoft.com/fwlink/?LinkId=724062。
链接的文档中对此进行了基本解释。
首先,您需要使用HasOne和WithOne。
其次,您必须用于HasForeignKey指定两个实体中的哪一个是从属的(当其中一个实体中没有定义单独的FK属性时,无法自动检测到该实体)。
第三,不再需要依赖。该IsRequired方法可用于指定当从属实体使用单独的FK时是否需要FK(而不是如您所愿的PK,即所谓的“ 共享主键关联”,因为PK显然不能为空)。
话虽如此,发布模型的正确F Core流利配置如下:
modelBuilder.Entity<User>()
.HasOne(e => e.Account)
.WithOne(e => e.User)
.HasForeignKey<Account>(e => e.AccountId);
Run Code Online (Sandbox Code Playgroud)
结果是:
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);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4069 次 |
| 最近记录: |