ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-实体框架代码优先关联/ FK问题和假设/默认值

2019-12-07 23:08:35  阅读:235  来源: 互联网

标签:ef-code-first c entity-framework


我对实体框架能够掌握实体之间关系的方式感到非常困惑.我对此有一些疑问.

在一个简单的测试应用程序中,我有一个人表,一个便笺表和一个图片资产表.

>有很多图片,每个图片由一个人拥有(一个人可以拥有多个).
>有很多笔记,每个笔记都由一个人拥有(一个人可以拥有多个).
>最后,一个人的徽标是图片.

.

    public class Person
    {
        public int ID { get; set; }

        public string name { get; set; }

        public Picture logo { get; set; }
    }

    public class Note
    {

        public int ID { get; set; }

        public string Text { get; set; }

        public Person Owner { get; set; }
    }


 public class Picture
    {

        public int ID { get; set; }

        public string Path { get; set; }

        public Person Owner { get; set; }
    }

当我尝试运行时,出现错误“无法确定类型之间的关联的主要结尾.”.

(如果我放下Person.logo字段,进行编译/运行,然后将其与FK关系一起手动添加到SQL中,则它将按预期的方式工作100%…我似乎无法弄清楚如何设置此值来自EF本身).

您可以协助解决错误吗?我在这里已经读了很多答案,但是,我似乎无法适应它来解决我的错误.

但是,现在我有了一对多和多对一(我不认为这归类为多对多吗?),我只是不了解如何创建人对象,其中FK不可为空且FK还不存在.

我发现我真的不喜欢的解决方案是使person.picture列可为空,然后创建一个人,然后创建图片,然后将图片分配给person对象……但是,理想情况下,我不希望它可以为空.应该总有一张照片.

解决方法:

假设您的1:1关系为旧答案:

向下滚动以获取澄清的答案.

这有两种方法可以实现,一种方法是应用1:N删除cross reference导航.

    public class Person
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public virtual Picture Logo { get; set; }
    }

    public class Note
    {
        public int ID { get; set; }
        public string Text { get; set; }
    }


    public class Picture
    {
        public int ID { get; set; }
        public string Path { get; set; }
    }

这是一个非常便宜的解决方案,您可能不想要比人更多的便条或图片…

因此,使用Data Annotations指示外键是什么,这将保留导航和1:1.

    public class Person
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public virtual Picture Logo { get; set; }
    }

    public class Note
    {
        [Key, ForeignKey("Person")]
        public int OwnerID { get; set; }
        public string Text { get; set; }
        public virtual Person Owner { get; set; }
    }


    public class Picture
    {
        [Key, ForeignKey("Person")]
        public virtual int OwnerId { get; set; }
        public string Path { get; set; }
        public virtual Person Owner { get; set; }
    }

如您所见,由于1:1的关系,图片和便笺将使用相同的ID.如果您的密钥未命名为ID,则需要添加KeyAttribute,在这种情况下,我们还添加ForeignKeyAttribute.

请注意,您应该使用虚拟的,以便只有在您请求时才加载内容,如果您只想要Person的名称,则很可能不希望数据库查询Picture信息.

Association properties that are marked as virtual will by default be lazy-loaded. What this means is that if you retrieve a Product entity, its Category information will not be retrieved from the database until you access its Category property (or unless you explicitly indicate that the Category data should be retrieved when you write your LINQ query to retrieve the Product object).

— 07006

关于您的澄清的新答案:

回到带有ICollection<T>的1:N结构,进一步了解外键;一旦获得像var boss = Person.Find(BossID)这样的人,您就可以访问boss.Pictures,其中将包含各种图片.您还可以将boss.Logo分配为这些图片之一.

    public class Person
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public virtual Picture Logo { get; set; }
        public ICollection<Picture> Pictures { get; set; }
        public ICollection<Note> Notes { get; set; }
    }

    public class Note
    {
        public int ID { get; set; }
        [ForeignKey("Person")]
        public int OwnerID { get; set; }
        public string Text { get; set; }
        public virtual Person Owner { get; set; }
    }


    public class Picture
    {
        public int ID { get; set; }
        [ForeignKey("Person")]
        public virtual int OwnerId { get; set; }
        public string Path { get; set; }
        public virtual Person Owner { get; set; }
    }

标签:ef-code-first,c,entity-framework
来源: https://codeday.me/bug/20191207/2087106.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有