Entity Framework 6 关系

Entity Framework 6 Relationship

使用的工具:

WPF .Net 4.5
MySQL - Lastest version
Visual Studio 2013 Community Edition

问题

嗨,

我在将 POCO 对象映射到现有对象时遇到问题 我有一个包含 ID 属性 的基础 class 的数据库 所有模型 classes.

都继承了这一点

基础 class 本身在上下文的 OnModelCreating 中被忽略 方法,当我尝试指定关系时问题就开始了 在用户和会话之间。

table组如下:

====================
User
====================
ID | Name | Password
====================


====================
Session
====================
ID | Password | User
====================

会话 table 中的第三列 "User",包含 用户 ID,所以通常我可以将用户 table 加入会话 table 与普通旧 SQL.

我在网上看到的所有示例都涉及创建导航 属性,第一个问题,它创建了循环引用 当您尝试序列化对象时,这会让人头疼,并且 序列化用于客户端和服务器之间的通信。

第二个问题是,这是一个更大的玩具示例 系统,对象会被很多属性污染。

是这个例子,会话对象知道用户但是用户 不知道他的会话。到目前为止,我试图将会话与 以下:

public
class SessionMap : EntityTypeConfiguration <Session>
{
    public
    SessãoMap ()
    {
        /**
         * Table.
         */
        this.ToTable ("Session");

        /**
         * Primary key.
         */
        this.HasKey (a => a.ID);

        /**
         * Columns.
         */
        this.Property (a => a.ID      );
        this.Property (a => a.Password);

        this.HasRequired (a => a.User)
            .WithMany    ();
    }
}

但是如您所见,我没有指定外键 当我尝试保存时出现以下错误 会话对象:

Unknown column 'User_ID' in 'field list'

这是有道理的,但我该如何解决呢? :s

参考代码

public
abstract
class Base
{
    public Int64 ID {get;set;}
}

public
class User : Base
{
    public String Name     {get;set;}
    public String Password {get;set;}
}

public
class Session : Base
{
    public String Password {get;set;}
    public User   User     {get;set;}
}

public
class Context : DbContext
{
    public DbSet <Session> Sessions {get;set;}
    public DbSet <User>    Users    {get;set;}

    public
    Context () : base ("name=MySQLConnectionString")
    {
    }

    protected
    override
    void OnModelCreating (DbModelBuilder Builder)
    {
        base.OnModelCreating (Builder);

        Builder.Ignore <Base> ();

        Builder.Configurations.Add (new Mapping.SessionMap ());
        Builder.Configurations.Add (new Mapping.UserMap    ());
    }
}

找到答案。

在会话 table 中,我将 "User" 列更改为 "UserID",然后 在 SessionMap class 我做了以下事情:

this.HasRequired (a => a.User)
    .WithMany    ()
    .Map         (m => m.MapKey ("UserID"));