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"));
使用的工具:
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"));