gpt4 book ai didi

c# - 如何使用 EF Code First 避免外表中的重复行

转载 作者:行者123 更新时间:2023-11-30 22:56:08 27 4
gpt4 key购买 nike

在我的应用程序中,电影 存储在数据库中。这些电影有一个名称和一个导演

众所周知,任何与其他人具有相同姓名的人都是同一个人。我想在应用程序中实现此约束。

我的模型是:

public class MovieContext: DbContext
{
public MovieContext(): base("name=testDB") { }
public DbSet<Movie> Movies { get; set; }
public DbSet<Director> Revenues { get; set; }
}

public class Movie
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public virtual Director Director { get; set; }
}

public class Director
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}

我的申请是

static void Main()
{

Director directorA = new Director()
{
Name = "A"
};


Movie movie1 = new Movie()
{
Name = "foo",
Director = directorA
};

Movie movie2 = new Movie()
{
Name = "bar",
Director = directorA
};
using (var context = new MovieContext())
{
context.Movies.Add(movie1);
context.SaveChanges();
}
using (var context = new MovieContext())
{
context.Movies.Add(movie2);
context.SaveChanges();
}
}

(我正在处理两个插入之间的上下文以模拟程序的两次不同运行)。

运行此命令会在 Directors 表中创建两行:

Id  Name
1 A
2 A

由于导演 1 和导演 2 同名,他们是同一个人,因此我更希望有一个单独的行。

我尝试为此使用索引,并修改了我的 Director 模型:

public class Director
{
[Key]
public int Id { get; set; }
[Index(IsUnique =true), StringLength(30)]
public string Name { get; set; }
}

但是,这会在运行时抛出异常,因为 EF 会尝试两次插入同一行。这显然不是正确的做法。

在使用 Entity Framework 插入数据时,确保使用相同 ID 引用相同外部对象的正确方法是什么?

最佳答案

正确的方法是在第二个操作中从上下文 context.Directors.FirstOrDefault (d => d.Name == "A") 中找到 director 对象并使用返回的对象,而不是尝试重新使用您预先创建的对象。

关于c# - 如何使用 EF Code First 避免外表中的重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54635077/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com