我有EF的som映射问题。
这是我的课程
public class User{
public Guid Id { get; set; }
// Fullname of the user account owner
public string Name { get; set; }
public string Email { get; set; }
public string Username { get; set; }
public Player Player { get; set; }
}
public class Player
{
public Guid Id { get; set; }
public string Name { get; set; }
public virtual User User { get; set; }
}
它工作正常,但现在我想在这个类中创建导航属性Player和User。我有这个Fluent代码:
modelBuilder.Entity<User>()
.HasOptional(x => x.Player)
.WithOptionalDependent(x => x.User)
.Map(x => x.MapKey("Username"));
但我只收到这条错误信息,而且我不知道出了什么问题。
类型中的每个属性名称必须是唯一的。属性名称'用户名' 已定义。
我的数据库设置看起来像类,在播放器表中,名称是唯一的。它在User表中不是唯一的。用户可以在没有播放器的情况下存在,反之亦然。 (实际上我不想在Player类中有任何User属性,但我认为这是一个需求?!)
答案 0 :(得分:1)
我认为它抱怨UserName已经是对象模型中的属性。请参阅Map()方法的文档:
配置使用外键属性的关系 未在对象模型中公开。列和表可以是 通过指定配置操作进行自定义。如果是空的 指定配置操作然后列名称 按惯例生成。如果外键属性暴露在 对象模型然后使用HasForeignKey方法。不是所有的关系 支持在对象模型中公开外键属性。
答案 1 :(得分:0)
删除modelBuilder代码并将PrimaryKey标记为依赖表上的ForeignKey。例如,如果没有用户,则不存在玩家:
public class User
{
public Guid Id { get; set; }
// Fullname of the user account owner
public string Name { get; set; }
public string Email { get; set; }
public string Username { get; set; }
public Player Player { get; set; }
}
public class Player
{
[ForeignKey("User")]
public Guid Id { get; set; }
public string Name { get; set; }
public virtual User User { get; set; }
}
ForeignKey属性告诉EF一对一哪一侧依赖,允许它正确映射。
答案 2 :(得分:0)
如果数据库中的列与模型的属性具有相同的名称,则无需映射属性“.Map(x =&gt; x.MapKey(”Username“));” EF已使用约定映射了属性“用户名”,因此EF正在抱怨
答案 3 :(得分:0)
使用您的实体
......我只是喜欢这样做:
modelBuilder.Entity<Player>()
.HasRequired(i => i.User)
.WithRequiredDependent(i => i.Player);
或此(可选):
modelBuilder.Entity<Player>()
.HasRequired(i => i.User)
.WithOptional(x => x.Player);