EF映射一对一可选

时间:2012-09-01 13:42:25

标签: c# mysql entity-framework entity-framework-4.1

我有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属性,但我认为这是一个需求?!)

4 个答案:

答案 0 :(得分:1)

我认为它抱怨UserName已经是对象模型中的属性。请参阅Map()方法的文档:

来自http://msdn.microsoft.com/en-us/library/system.data.entity.modelconfiguration.configuration.foreignkeynavigationpropertyconfiguration.map%28v=vs.103%29

  

配置使用外键属性的关系   未在对象模型中公开。列和表可以是   通过指定配置操作进行自定义。如果是空的   指定配置操作然后列名称   按惯例生成。如果外键属性暴露在   对象模型然后使用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);
相关问题