实体框架 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 ());
}
}
找到了答案。
在会话表中,我将"用户"列更改为"用户ID",然后在会话映射类中,我做了以下操作:
this.HasRequired (a => a.User)
.WithMany ()
.Map (m => m.MapKey ("UserID"));