我正在尝试使用 EF Code First 创建 SQL 数据库。
假设我有以下代码:
public class Account
{
public int Id;
public ICollection<User> Users;
}
public class User
{
public int Id;
public int AccountId;
}
public class AccountContext : DbContext
{
public DbSet<Account> Accounts;
public DbSet<User> Users;
}
(请注意,缺少任何 Fluent API 命令或数据注释;我想按照惯例执行此操作。)
创建数据库后,我在 Users 表中得到以下字段:
Id
AccountId
Account_Id
为什么 EF 没有意识到“AccountId”指的是帐户的“Id”主键(按照惯例)?如果可能的话,我想避免使用 Fluent API/DA 手动映射此内容,并且我想避免在用户上拥有帐户导航属性。
我知道只有两种方法可以执行您想要执行的操作,即通过数据注释(非常快)或流畅的映射。你不能只说public int AccountId;
并期望一切顺利。
Fluent API 映射双向
public class Account
{
public int Id { get; set; }
public ICollection<User> Users { get; set; }
}
public class User
{
public int Id { get; set; }
public Account Account { get; set; }
}
public class AccountContext : DbContext
{
public AccountContext()
: base("DefaultConnection")
{
}
public DbSet<Account> Accounts { get; set; }
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().HasRequired(u => u.Account)
.WithMany(a => a.Users)
.HasForeignKey(u => u.AccountId);
}
}
数据注释双向
public class Account
{
[Key]
public int Id { get; set; }
public ICollection<User> Users { get; set; }
}
public class User
{
[Key]
public int Id { get; set; }
[ForeignKey("Account"), DatabaseGenerated(DatabaseGeneratedOption.None)]
public int AccountId { get; set; }
public Account Account { get; set; }
}
// and of course you need your context class, but with less code
public class AccountContext : DbContext
{
public AccountContext()
: base("DefaultConnection")
{
}
public DbSet<Account> Accounts { get; set; }
public DbSet<User> Users { get; set; }
}
没有数据注释或 Fluent API 映射双向
public class Account
{
public int Id { get; set; } //as Id in Accounts Table
public ICollection<User> Users { get; set; }
}
public class User
{
public int Id { get; set; } //as Id in Users Table
public Account Account { get; set; } // as Account_Id in Users Table
}
// and of course you need your context class, but with less code
public class AccountContext : DbContext
{
public AccountContext()
: base("DefaultConnection")
{
}
public DbSet<Account> Accounts { get; set; }
public DbSet<User> Users { get; set; }
}
我希望这对您或其他有疑问的人有帮助
Edit
如果你想避免Bi-Directional
导航然后进行更改Users
像这样
public class User
{
public int Id { get; set; }
//delete below from User class to avoid Bi-directional navigation
//public Account Account { get; set; }
}
Note:未经测试,但逻辑合理
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)