实体框架 6 关系

本文关键字:关系 框架 实体 | 更新日期: 2023-09-27 18:35:50

使用的工具:

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

问题

你好

我在将 POCO 对象映射到现有对象时遇到问题我有一个包含 ID 属性的基类的数据库所有模型类都继承。

基类本身在上下文的 OnModelCreating 中被忽略方法,当我尝试指定关系时出现问题在用户和会话之间。

表格如下:

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

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

会话表中的第三列"用户"包含用户 ID,所以通常我可以将用户表连接到会话带有普通旧 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'

这是有道理的,但我该如何解决这个问题?

参考代码

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    ());
    }
}

实体框架 6 关系

找到了答案。

在会话表中,我将"用户"列更改为"用户ID",然后在会话映射类中,我做了以下操作:

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