首页 新闻 搜索 专区 学院

在EF4.1中一对一关系中遇到的问题

0
悬赏园豆:50 [待解决问题]

在很多时候我们会把用户表拆分成两个表,我觉得在EF中尤其要这样设计,因为贪婪加载会把所有信息都加载进来,如果用户表中这样设计,则相应的效率问题会好很多。

然后T_Member和T_MemberInfo是一个一对一的关系。网上很多朋友都说,一对一关系,在两个Model类中都建立public virtual的导航属性,则就可以,但是我发现如果我在T_Member中也建立导航属性的话,则程序通不过。最后我只能在T_MemberInfo中建立一个导航属性,程序算勉强能运行。因为没有在T_Member中建立导航属性,所以,在T_Member中不能通过Include()。

[Table("T_Member")]
    public class Member
    {
        /// <summary>
        /// 索引ID  对于主键我们推荐使用“ID”或者“ProductID” 也就是“类名+ID”的方式,如此命名EntityFramework会自动的为我们找到表中主键
        /// </summary>
        [Column("F_ID")]
        public Guid ID { get; set; }

        //导航属性 和MemberInfo表是一个一对一的关系
        //通过实际操作,发现在一对一的关系中,我们不适合在两个类中都建立导航属性,
        //可取的操作是在外键表中建立一个导航属性
        //public virtual MemberInfo MemberInfo { get; set; }这个导航属性最后我是删掉的

       //导航属性 和MemberInRole是一个一对多的关系
        public virtual ICollection<MemberInRole> MemberInRole{ get; set; }
        
        /// <summary>
        /// 用户名
        /// </summary>
        [Column("F_Name")]
        [MaxLength(50)]
        public string Name { get; set; }
        
        /// <summary>
        /// 密码
        /// </summary>
        [Column("F_Password")]
        [MaxLength(50)]
        public string Password { get; set; }

        /// <summary>
        /// 真实姓名
        /// </summary>
        [Column("F_TrueName")]
        [MaxLength(50)]
        public string TrueName { get; set; }
    }
[Table("T_MemberInfo")]
    public class MemberInfo
    {
        [Column("F_ID")]
        public Guid ID { get; set; }

        [Column("F_MemberID")]
        public Guid MemberID { get; set; }
        //导航属性 和Member表是一个一对一的关系。只在外键表中建立
        public virtual Member Member { get; set; }
        
        /// <summary>
        /// 姓名拼音
        /// </summary>
        [Column("F_EnTrueName")]
        [MaxLength(50)]
        public string EnTrueName { get; set; }

        /// <summary>
        /// 姓名拼音首字母
        /// </summary>
        [Column("F_EnShortTrueName")]
        [MaxLength(50)]
        public string EnShortTrueName { get; set; }

不知道 ,各位朋友是怎么建立一对一关系的??

第二个 问题

先看图:

 

在很多时候,我们会设计一个关于系统中分类的表,这里对应T_Class,那这样造成的一个结果是一个表T_Ship可能多次要连接T_Class,如这里T_Ship表中F_ClassID和F_PlaceID都对应在T_Class中,不知道这种关系 我们该怎么建立呢?还有就是建立导航属性的时候,对应的外键列的名称只能是以类名+ID的形式?至少我发现是这样,如这里

[Column("F_ClassID")]

public string ClassID;//这个对应的名称只能是这样,而不能有别的名称,否则对应不起来。

如果这样的话,那么这个F_PlaceID字段就不能建立隐射关系了?不知道有没有朋友知道怎么解决这个问题。

 

 

针对第二个问题补充下:

对应的MemberInfo类为

[Table("T_MemberInfo")]
    public class MemberInfo
    {
        [Column("F_ID")]
        public Guid ID { get; set; }

        [Column("F_MemberID")]
        public Guid MemberID { get; set; }
        //导航属性 和Member表是一个一对一的关系。只在外键表中建立
        public virtual Member Member { get; set; }
        
        /// <summary>
        /// 姓名拼音
        /// </summary>
        [Column("F_EnTrueName")]
        [MaxLength(50)]
        public string EnTrueName { get; set; }

        /// <summary>
        /// 姓名拼音首字母
        /// </summary>
        [Column("F_EnShortTrueName")]
        [MaxLength(50)]
        public string EnShortTrueName { get; set; }

        /// <summary>
        /// 部门ID
        /// 注意MIS.Model.Category表中相应的
        /// </summary>
        
        [Column("F_DepartmentID")]
        public Guid DeparmentID { get; set; }
        
public virtual Category Category { get; set; } }

而在Category中

[Table("T_Category")]
    public class Category
    {
        [Column("F_ID")]
        public Guid ID { get; set; }

        [Column("F_Name")]
        [MaxLength(50)]
        public string Name { get; set; }

        [Column("F_ParentID")]
        public Guid ParentID { get; set; }
        [Association("MemberInfo", "ID", "DepartmentID")]
        public virtual ICollection<MemberInfo> MemberInfo { get; set; } 
}

 

现在因为在MemberInfo中

/// <summary>
/// 部门ID
/// 注意MIS.Model.Category表中相应的
/// </summary>

[Column("F_DepartmentID")]
public Guid DeparmentID { get; set; }
public virtual Category Category { get; set; }

这里的public Guid DepartmentID 我没有按照外键表+ID的(即没有取名为CategoryID),所以出现问题了 。如果我不按外键表+ID的原则要建立这个对应,改怎么建立呢?这里我因为MemberInfo中可能还有其它字段,如F_PlaceID,而这个Place也是在Category表中的,所以我不能按外键表+ID的设计原则,如果这样,会有两个同名了,所以,我只能取名为DepartmentID和PlaceID,但是这里就对应不起来了,按照“随便走走”的说法,使用Association但是还是不行啊?是不是我建错了?

海底的鱼的主页 海底的鱼 | 初学一级 | 园豆:77
提问于:2012-07-19 15:23
< >
分享
所有回答(6)
0

第一个问题程序通不过是什么提示,我这边没有做过这种分表的方式,但是一对一的我们有,都是有建立双向关系的。

第二个问题是说导航属性么,是可以通过association属性建立关系的,这里面需要指定关联表双方的关联字段。

随处走走 | 园豆:123 (初学一级) | 2012-07-19 15:42

System.InvalidOperationException: Unable to determine the principal end of an association between the types 'MIS.Model.MemberInfo' and 'MIS.Model.Member'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.

支持(0) 反对(0) 海底的鱼 | 园豆:77 (初学一级) | 2012-07-19 15:54

提示就是这个,意思好像是说关系里面有问题!你建立双向联系,就是指两边都建立一个导航属性吗?

支持(0) 反对(0) 海底的鱼 | 园豆:77 (初学一级) | 2012-07-19 15:55

是导航属性,可能问题描述的不是很清晰,关于association的,能否稍微多提示点呢?

支持(0) 反对(0) 海底的鱼 | 园豆:77 (初学一级) | 2012-07-19 15:59

@海底的鱼: 你这种纵向分割的关系跟我的不一样,你的两个主键名称是一样的, 你可以试一下在导航属性上加assocition试一下.

支持(0) 反对(0) 随处走走 | 园豆:123 (初学一级) | 2012-07-19 16:05

@海底的鱼: 

[Association("ABC", "F-ID", "F-ID")]
public virtual ICollection<ABC> ABCs { get; set; }

你可以看下具体google下,看能不能满足你的要求.

支持(0) 反对(0) 随处走走 | 园豆:123 (初学一级) | 2012-07-19 16:09

@随处走走: 好的 先3ks下

支持(0) 反对(0) 海底的鱼 | 园豆:77 (初学一级) | 2012-07-19 16:33

@随处走走: 你这个F-ID是数据库字段还是模型的字段?难道是数据库字段?

支持(0) 反对(0) 海底的鱼 | 园豆:77 (初学一级) | 2012-07-19 16:37

@随处走走:  貌似不可以啊!

支持(0) 反对(0) 海底的鱼 | 园豆:77 (初学一级) | 2012-07-19 16:47

@随处走走: 我补充了下问题,你再帮我看看呢!!!纠结啊!

支持(0) 反对(0) 海底的鱼 | 园豆:77 (初学一级) | 2012-07-19 16:58

@海底的鱼: 是模型字段,Association加载关联关系上

支持(0) 反对(0) 随处走走 | 园豆:123 (初学一级) | 2012-07-19 17:05

@随处走走: 那如果是模型字段的话,那就是我写的那样啊,但是问题没有解决啊~~

支持(0) 反对(0) 海底的鱼 | 园豆:77 (初学一级) | 2012-07-19 17:06

@随处走走: 刚刚弄错了,但是按你说的,我改过来了,但是还是有问题

支持(0) 反对(0) 海底的鱼 | 园豆:77 (初学一级) | 2012-07-19 17:09
0

 看着有点晕了

jerry-Tom | 园豆:4077 (老鸟四级) | 2012-07-20 10:12

哪里晕啊?我问题还没有解决啊!郁闷!

支持(0) 反对(0) 海底的鱼 | 园豆:77 (初学一级) | 2012-07-20 12:16
-1

对于一对一的关系,请看我的博客,里面有解决这个问题的办法

http://www.cnblogs.com/firstcsharp/archive/2013/03/19/2968896.html

也就是直接加是:

[Required]就行了
小氕 | 园豆:86 (初学一级) | 2013-03-19 12:13

答非所问不想说你

支持(0) 反对(0) yarice | 园豆:202 (菜鸟二级) | 2017-02-21 15:47
0

第一个问题,F_ID上加上[Key],如果使用非主键列进行1对1关联,则加上[Required]

Karas | 园豆:202 (菜鸟二级) | 2014-07-31 15:51
-1

由于是一对一的关系,所以[Column("F_MemberID")] public Guid MemberID { get; set; } MemberId这个属性是多余的(直接令MemberInfo.Id=User.Id即可),而且需要给导航属性添加Required特性 [Required]public virtual Member Member { get; set; } 。

Simonn | 园豆:254 (菜鸟二级) | 2015-11-03 12:02

答非所问,不想说你

支持(0) 反对(0) yarice | 园豆:202 (菜鸟二级) | 2017-02-21 15:47
0

Member.ID和MemberInfo.MemberID 怎么一对一关联,Required自动匹配成Member.ID和MemberInfo.ID关联了,所以不对

yarice | 园豆:202 (菜鸟二级) | 2017-02-21 15:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册