编程语言
首页 > 编程语言> > c#-实体框架代码优先关联/ FK问题和假设/默认值

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

作者:互联网

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

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

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

.

    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